2012-04-03 13 views
5

マルチプロセッシングモジュールを使用して2つ(またはそれ以上)のGTKウィンドウを生成するpythonスクリプトを作成しようとしています。私はここに壁に当たっているようだ。2kウィンドウでのPythonマルチプロセッシング

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:致命的なIOエラー0を(ここでは、コードと私は取得していますエラーがあります成功)をXサーバー上に設定します。 Python:../../src/xcb_io.c:249:process_responses:アサーション `((long)(dpy-> last_request_read) - (long)(dpy-> request))< = 0) 'に失敗しました。

は時々私は得る:

multiwin.py:0.0:Xサーバ上の致命的なIOエラー11(リソース一時的に利用できません)。

問題はgtkループですか?マルチプロセッシングはそれらを分離しないのですか?

非常に参考になります。

+0

本当にマルチプロセスを使用したいのですか、2つのウィンドウを持ちたいだけですか? – liberforce

+0

私は本当にこれが別々のプロセスにある必要があります。 –

+0

呼び出しスクリプトでgtkをインポートしていますか?私はあなたの問題を再現することができました。なぜなら、呼び出し側のスクリプトにインポートgtkがあったのですが、削除したときはインポートできませんでした。インポートはtiny_gtk_process関数内にのみあります。 – bohrax

答えて

0

問題は、exec()の代わりにfork()を使用して新しいプロセスを作成するマルチプロセッシング。プロセスを使用している可能性が高いです。つまり、各サブプロセスは、Xサーバーに接続するものを含め、その親プロセスと同じファイルハンドルを共有します。クラッシュは、複数のプロセスが同じ接続上で同時にサーバーと通信しようとしているために発生します。

よりよい解決策は、プロセスを開始するためにサブプロセスを使用することです。プロセス間でマルチプロセッシングのような通信を行う場合は、my answer to this questionを参照してください。

関連する問題