WX.Python 和多进程

2 投票
1 回答
636 浏览
提问于 2025-04-16 04:57

我有一个用wx.python写的应用程序,它可以处理一些文件,当我点击一个按钮时就会开始处理。我需要让这个处理过程能够同时进行。

我在按钮的功能代码里用了以下这段代码:

  my_pool = multiprocessing.Pool(POOLSIZE)

  results=[digest_pool.apply_async(self.fun, [args]) for file in list_files() ]

  my_pool.close()

  my_pool.join()

    for result in results :

       print result.get()

但是这段代码似乎根本没有运行,即使我在函数里打印了一些东西。我没有得到任何结果,而且我的图形界面应用程序也卡住了。有人能帮忙吗?这里的问题是什么,我该如何在我的wx框架类中使用池子多进程模块来解决这个问题呢?

1 个回答

1

看起来你遇到了一个很多人使用线程和图形界面工具包时都会碰到的常见问题。这个问题的核心是,你绝对不能让主图形界面的线程被阻塞。图形工具包需要不断地响应各种事件。当你调用 my_pool.join() 时,你实际上是让主线程“睡觉”,结果就是整个程序看起来像是卡住了一样。

我对wxWidgets不是特别熟悉,但我相信有一些方法可以让你在使用它时处理线程。你可以很容易地从图形界面线程中启动后台线程,但把结果传回主线程通常是个难题。你需要某种异步的“工作完成”事件,当后台操作完成时,可以把这个事件发送给主图形界面线程。具体怎么做在不同的工具包中会有所不同。我不太清楚wxWidgets的具体机制,但我想快速搜索一下应该能找到答案(或者也许会有热心的评论者提供链接;-)

撰写回答