2013-01-19 50 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