Próbuję utworzyć skrypt Pythona, który używa modułu wieloprocesorowego do tworzenia 2 (lub więcej) okien GTK. Wydaje mi się, że uderzam w ścianę. Oto kod i błędy, które otrzymuję:
p1 = Process(target=tiny_gtk_process, name="process 1")
p1.start()
p2 = Process(target=tiny_gtk_process, name="process 2")
p2.start()
i:
def tiny_gtk_process():
import gtk
window = gtk.Window()
window.set_size_request(800,600)
window.show_all()
gtk.main()
Przez większość czasu otrzymuję:
multiwin.py: Błąd krytyczny IO 0 (sukces) na serwerze X: 0.0. python: ../../src/xcb_io.c:249: process_responses: Assertion `(((long) (dpy-> last_request_read) - (długi) (dpy-> request)) <= 0)
Czasami dostaję:
multiwin.py: Błąd krytyczny IO 11 (Zasób chwilowo niedostępny) na serwerze X: 0.0.
Czy problem dotyczy pętli gtk? Czy proces wieloprocesorowy ich nie izoluje?
Wszelkie pomysły byłyby bardzo pomocne.
Odpowiedzi:
0 dla odpowiedzi № 1Najprawdopodobniej używasz tego problemumultiprocessing.Process, który tworzy nowe procesy za pomocą fork () zamiast exec (). Oznacza to, że każdy podproces dzieli ten sam uchwyt pliku co jego rodzic, w tym te, które łączą go z serwerem X. Przyczyną awarii jest to, że wiele procesów próbuje jednocześnie komunikować się z serwerem w tym samym połączeniu.
Lepszym rozwiązaniem byłoby użycie subprocess.Popen lub podobnego, aby rozpocząć procesy. Jeśli chcesz komunikować się między procesami w sposób wieloprocesowy, zobacz moja odpowiedź na to pytanie.