2013-01-19 34 views
1

我正在pyqt4中编写一个应用程序,它必须读入并解析许多xml文件。完成单线程操作需要花费一些时间来完成所有的解析工作,并使数千个python对象与该传入的xml相对应。我已经剖析了代码,并且据我所知它是计算,而不是I/O,绑定。如何使用PyQt4进程使用多核python?

我想将应用程序转换为多核模型,以使用工人农场模型(?Process.Pool in python)传播负载。

但是,我也希望能够通知工人进度更新gui。

从我目前阅读的内容看来,QThread并非多核能力(因为它在一个内核上循环),但是我需要QThread来完成Signal,所以基本上我不能这么做。

我可能会安排不需要来自工人的信号,只有来自农民,这可能意味着我可以继续,但是然后我想知道:我可以返回一个Python对象列表从一个进程到另一个?

回答

4
  • 生成一个QThread。
  • QThread可以将任务移出到多处理池。您可能使用 使用pool.apply_async(),它有一个回调参数。
  • 回调参数允许您指定在目标函数完成时调用的函数 。
  • 该回调在QThread中运行,并将目标函数的返回值作为其唯一参数发送。
  • 每次回调函数运行时,都可以将GUI更新为 表示进度。
+0

谢谢你。这大概是我对我的“安排不需要”段所想到的,虽然很高兴知道它可以工作。多处理会返回我的python对象吗? – rivimey

+0

多处理池通过[队列](http://docs.python.org/2/library/multiprocessing.html#multiprocessing.Queue)与子进程通信。通过队列传输的所有东西都被腌制。所以目标函数返回的值必须是可选择的。以下是[可以腌制的东西]的类型列表(http://docs.python.org/2/library/pickle.html#what-c​​an-be-pickled-and-unpickled)。请注意,它也可以教Python [如何腌制新类型的对象](http://docs.python.org/2/library/pickle.html#pickling-and-unpickling-extension-types)。 – unutbu

+0

所以简短的答案是,只要返回值是可以选择的,一切都是好的。 – unutbu