【问题标题】:python multiprocessing with 2 gtk windows带有 2 个 gtk 窗口的 python 多处理
【发布时间】:2012-04-03 08:13:42
【问题描述】:

我正在尝试制作一个使用多处理模块生成 2 个(或更多)GTK 窗口的 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:X 服务器:0.0 上的致命 IO 错误 0(成功)。 python: ../../src/xcb_io.c:249: process_responses: Assertion `(((long) (dpy->last_request_read) - (long) (dpy->request))

有时我会得到:

multiwin.py:X server :0.0 上的致命 IO 错误 11(资源暂时不可用)。

问题是 gtk 循环吗?多处理不会隔离它们吗?

任何想法都会非常有帮助。

【问题讨论】:

  • 你真的想使用多进程,还是只想拥有 2 个窗口?
  • 我真的需要这个在不同的进程中。
  • 你是在调用脚本中导入gtk吗?当我在调用脚本中有 import gtk 时,我能够重现您的问题,但当我删除它并且导入仅在 tiny_gtk_process 函数中时,我无法重现您的问题。

标签: python gtk multiprocessing


【解决方案1】:

问题很可能是您正在使用 multiprocessing.Process,它使用 fork() 而不是 exec() 创建新进程。这意味着每个子进程与其父进程共享相同的文件句柄,包括那些将其连接到 X 服务器的文件句柄。崩溃是因为多个进程试图通过同一连接同时与服务器通信。

更好的解决方案是使用 subprocess.Popen 或类似方法来启动您的流程。如果您想在进程之间进行类似多处理的通信,请参阅my answer to this question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多