2011-07-17 118 views
0

我一直在嘗試各種解決方案以解決以下問題;無濟於事。事件驅動的線程創建

我有大量的(python)模塊/腳本和高級腳本K.py。

當K.py被執行時,它會生成一些信息,比如國名。現在,在其他模塊(數百個)中,將會有一些模塊可以與由K.py生成的信息(國名,本例)一起作爲輸入傳遞給它們。遞歸地,上面的每個模塊都會生成一些信息(城鎮名稱,街道號等),可以作爲其他模塊的輸入,等等。 這當然會導致執行腳本的二叉樹。

注意事項。

  • 模塊/腳本(數百個)以上可獨立運行(不-依賴間以任何方式)
  • 我應該能夠把當所有模塊已經完成執行判決(這是運行K.py必須阻塞,直到excecuting模塊的觸發二叉樹被「加入」)。如果對於每個信息I和可運行腳本S(即S可能以I作爲輸入運行),我決定創建一個新的線程,最終可能會有一個指數數量的線程(No ?)

如何使用python線程(任何API)來'安全地'實現解決方案? (pseudo_code?)

在此先感謝您的智慧。

回答

2

解決此問題的常用方法是創建工作隊列並將單個作業存儲在那裏。所以你需要某種應該由一個線程完成的工作的程序化表示。

如果您有可以使用提供「線程」池(請參見16.3.1.5。)的multiprocessing package以及一個多線程隊列來存儲作業。

現在,每個進程都從隊列中取出一個作業,執行它 - 可能會向隊列中添加新作業 - 以及何時完成下一個作業。當隊列爲空時,你就完成了。

請注意,它使用多處理程序包,因爲至少在CPython中使用GIL時,多線程python程序僅適用於大型IO或其他阻塞活動。

+0

感謝Voo。 我正在嘗試多處理包。 (我正在考慮用替代方法來表示'工作',正如Pool所說的(..)需要醃製的等等)。 非常感謝。 – dop

+0

我不確定Pool的意思()(沒有看到這樣的方法?)和酸洗。就我個人而言,我只是創建一個while循環,從隊列中移除第一個元素並處理它。如果隊列爲空,則所有線程都返回並完成。您通過創建隊列,將第一份作業放入其中,然後使用該池來啓動該過程。 – Voo