7

次のコードは、Linux の python 3.2.2 で何もせずにハングします。

import tkinter
from multiprocessing import Process

def f():
    root = tkinter.Tk()
    label = tkinter.Label(root)
    label.pack()
    root.mainloop()

p = Process(target=f)
p.start()

この問題について私が見つけた唯一の情報はissue 5527で、問題はプロセスが fork される前にインポートされたことにあり、関数内にtkinterインポートすることで修正でき、問題は Linux で発生することが指摘されていますが、ソラリスではありません。tkinterf

この問題の原因を正確に知っている人はいますか?それが意図的なものなのか、最終的に修正されるのか? 必要な場所ならどこでもローカルにインポートする以外に回避策はありますかtkinter(スタイルが悪いようです)。マルチプロセッシングで同様の問題が発生する他のモジュールはありますか?

4

2 に答える 2

0

私の疑いでは、問題は X サーバー (通常はソケット) への接続に関係しているということです。fork()プロセスが-edされる前にこれが作成された場合、子プロセスはこの接続を継承します。しかし、それを使用しようとすると、X サーバーが混乱します。

をざっと見てみると、プロセスを開始する前に関数Tkinter.pyを呼び出すと便利ようです。それはすべて、X サーバーへの接続がいつ確立されるかによって異なります。NoDefaultRoot

それ以外の場合は、フォークの後に Tkinter をインポートする方法が適しているようです。

于 2012-09-01T23:08:40.290 に答える