многопроцессорная обработка Python с 2 окнами - PullRequest
5 голосов
/ 03 апреля 2012

Я пытаюсь создать скрипт на python, который использует многопроцессорный модуль для создания 2 (или более) окон GTK. Кажется, я бью стену. Вот код и ошибки, которые я получаю:

p1 = Process(target=tiny_gtk_process, name="process 1")
p1.start()
p2 = Process(target=tiny_gtk_process, name="process 2")
p2.start()

и

def tiny_gtk_process():

    import gtk

    window = gtk.Window()
    window.set_size_request(800,600)

    window.show_all()

    gtk.main()

Большую часть времени я получаю:

multiwin.py: фатальная ошибка ввода-вывода 0 (успех) на X-сервере: 0,0. python: ../../src/xcb_io.c:249: process_responses: Утверждение `(((long) (dpy-> last_request_read) - (long) (dpy-> request)) <= 0) 'не выполнено. </p>

Иногда я получаю:

multiwin.py: неустранимая ошибка ввода-вывода 11 (ресурс временно недоступен) на X-сервере: 0,0.

Проблема в цикле gtk? Разве многопроцессорная обработка их не изолирует?

Любые идеи будут очень полезны.

1 Ответ

0 голосов
/ 04 августа 2012

Скорее всего, проблема в том, что вы используете multiprocessing.Process, который создает новые процессы, используя fork () вместо exec (). Это означает, что каждый подпроцесс использует те же дескрипторы файлов, что и его родительский дескриптор, включая те, которые подключают его к X-серверу. Сбой вызван тем, что несколько процессов пытаются обмениваться данными с сервером одновременно по одному и тому же соединению.

Лучшим решением было бы использовать subprocess.Popen или аналогичный для запуска ваших процессов. Если вам нужна многопроцессорная связь между процессами, см. мой ответ на этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...