2011-05-10 69 views
3

我正在使用一個多進程的工作池作爲更大的應用程序的一部分。由於我用它來處理大量的簡單數學,我有一個無共享體系結構,其中工作人員需要的唯一變量作爲參數傳遞。因此,我不需要工作程序子進程導入任何全局變量,我的__main__模塊或因此它導入的任何模塊。有什麼辦法來強制這樣的行爲,並避免產卵池時的性能問題?防止池進程導入__main__和全局變量

我要指出,我的環境是Win32的,缺乏os.fork()和工作進程正在使用的子進程調用sys.executable催生」(即啓動一個新的Python進程),其次是序列化所有的全局變量,併發送那些在管道上。「按照this SO post。這就是說,我希望儘可能少地做到這一點,所以我的泳池打開得更快。

任何想法?

回答

3

看看multiprocessing.forking的實現,特別是get_preparation_dataprepare(win32特有的),全局變量不會被醃製。重新導入父進程__main__有點難看,但它不會運行任何代碼,除了在頂層的代碼;條款甚至不包括if __name__ == '__main__'條款。所以只需保持主模塊沒有進口時的副作用。


您可以防止主模塊從進口任何子進程啓動時,太(僅在Win32,正如你注意,不能叉有用)。移動main()和進口一個獨立的模塊,使啓動腳本中只包含:

if '__name__' == '__main__': 
    from mainmodule import main 
    main() 

仍然有子進程啓動時隱import site。它做了重要的初始化,我不認爲mp.forking有一個簡單的方法來禁用它,但我不認爲它很貴。

+0

你在說什麼是真實的,並且將你的主代碼放在一個'__name__ =='__main __''子句中不言而喻,但*有*是明確的方式或至少是一組減少開始的最佳實踐子流程的時間。 – ktdrv 2011-05-12 22:32:48

+0

@kaloyan我認爲你沒有太多需要減少的東西,但我已經增加了一件不用說的事情,那就是你可以用這個子句來防止進口。 – Tobu 2011-05-15 20:53:12