2012-04-03 15 views
5

Sto provando a creare uno script Python che utilizza il modulo di multiprocessing per produrre 2 (o più) finestre GTK. Sto sbattendo un muro qui sembra. Ecco il codice e gli errori che sto ottenendo:multiprocessing di pitone con 2 finestre GTK

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

e:

def tiny_gtk_process(): 

    import gtk 

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

    window.show_all() 

    gtk.main() 

maggior parte del tempo sto ottenendo:

multiwin.py: Fatal error IO 0 (Successo) sul server X: 0.0. python: ../../src/xcb_io.c:249: process_responses: Asserzione `(((long) (dpy-> last_request_read) - (long) (dpy-> request)) < = 0) 'failed.

A volte ottengo:

multiwin.py: Fatal error IO 11 (Risorsa temporaneamente non disponibile) su X server: 0.0.

Il problema è il ciclo gtk? Il multiprocessing non li isola?

Qualsiasi idea sarebbe molto utile.

+0

Vuoi davvero usare il multiprocesso o vuoi semplicemente avere 2 finestre? – liberforce

+0

Ho davvero bisogno che questo sia in processi separati. –

+0

Stai importando gtk nello script chiamante? Sono stato in grado di riprodurre il tuo problema quando avevo un gtk di importazione nello script chiamante, ma non quando l'ho rimosso e l'importazione è solo nella funzione tiny_gtk_process. – bohrax

risposta

0

Il problema è molto probabile che si stia utilizzando multiprocessing.Process, che crea nuovi processi utilizzando fork() anziché exec(). Ciò significa che ogni processo secondario condivide gli stessi handle di file del suo genitore, inclusi quelli che lo collegano al server X. L'arresto anomalo è causato dal fatto che più processi stanno tentando di comunicare con il server simultaneamente sulla stessa connessione.

Una soluzione migliore sarebbe utilizzare il sottoprocesso.Popen o simile per avviare i processi. Se si desidera una comunicazione di tipo multiprocesso tra i processi, vedere my answer to this question.