2012-04-03 33 views
5

2 (veya daha fazla) GTK penceresi oluşturmak için çok işlemcili bir modülü kullanan bir python betiği yapmaya çalışıyorum. Burada bir duvara çarpıyorum.2 gtk pencereler ile python çoklu işleme

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

ve: İşte kod ve hatalar alıyorum olduğunu

def tiny_gtk_process(): 

    import gtk 

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

    window.show_all() 

    gtk.main() 

zaman alıyorum çoğu: (Fatal IO hatası 0:

multiwin.py X sunucuda başarı): 0.0. python: ../../src/xcb_io.c:249: process_responses: Assertion `(((uzun) (dpy-> last_request_read) - (uzun) (dpy-> istek)) < = 0) 'başarısız oldu.

Bazen olsun:

multiwin.py: 0.0: X sunucusu üzerinde Ölümcül GÇ hatası 11 (Kaynak geçici olarak).

Sorun gtk döngüsü mu? Çok işlem yapmak onları ayrılamaz mı?

Herhangi bir fikir çok yardımcı olabilirdi.

+0

Gerçekten çok işlemciyi kullanmak ister misiniz, yoksa sadece 2 pencereniz mi var? – liberforce

+0

Gerçekten ayrı işlemlerde olmak için buna ihtiyacım var. –

+0

Çağıran komut dosyasında gtk mi aktarıyorsunuz? Çağıran komut dosyasında bir import gtk vardı, ancak ben kaldırıldı ve ithalat sadece tiny_gtk_process işlevinde değilken, sorununuzu yeniden üretebildi. – bohrax

cevap

0

Sorun, çoklu işlem kullanıyor olmanız olasıdır.Process, exec() yerine fork() kullanarak yeni işlemler oluşturur. Bu, her bir alt işlemin, X sunucuya bağlayanlar da dahil olmak üzere, üst öğe ile aynı dosya tanıtıcılarını paylaştığı anlamına gelir. Birden çok işlem aynı bağlantı üzerinden aynı anda sunucuyla iletişim kurmaya çalıştığı için çökme neden olur.

Daha iyi bir çözüm, alt işlemi kullanmaktır. Proseslerinizi başlatmak içinPopen veya benzeri. İşlemleriniz arasında çok işlemcili iletişim istiyorsanız, bkz. my answer to this question.