为什么tkinter不能很好地处理多处理?

Jam*_*mes 5 python tkinter multiprocessing

以下代码挂起而没有在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()
Run Code Online (Sandbox Code Playgroud)

我发现的关于这个问题的唯一信息是问题5527,其中注意到问题是tkinter在进程分叉之前导入,可以通过tkinter在函数内部导入来修复f,并且问题发生在Linux但是不是Solaris.

有谁知道究竟是什么导致了这个问题,如果它是有意的还是最终会被修复?除了tkinter在我需要它的地方进行本地导入(这看起来像坏样式)之外,还有其他解决方法吗?是否有任何其他模块与多处理有类似的问题?

Rol*_*ith 0

我怀疑问题与 X 服务器(通常是套接字)的连接有关。如果这是在进程被fork()删除之前创建的,则子进程将继承此连接。但如果它尝试使用它,X 服务器就会感到困惑。

粗略查看后Tkinter.py,看起来NoDefaultRoot在启动进程之前调用该函数可能会有用。这完全取决于何时建立与 X 服务器的连接。

否则,在 fork 后导入 Tkinter 似乎是正确的方法。