亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python進程池非守護進程?

Python進程池非守護進程?

開心每一天1111 2019-10-08 15:26:19
是否可以創建非守護進程的python池?我希望一個池能夠調用內部有另一個池的函數。我想要這個,因為守護進程無法創建進程。具體來說,它將導致錯誤:AssertionError: daemonic processes are not allowed to have children例如,考慮這樣一個場景,其中function_a有一個運行的池,function_b而有一個運行的池function_c。該功能鏈將失敗,因為function_b它正在守護進程中運行,并且守護進程無法創建進程。
查看完整描述

3 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

在多處理模塊有一個漂亮的界面使用與進程池或線程。根據您當前的用例,您可能會考慮將其multiprocessing.pool.ThreadPool用于外部Pool,這將導致線程(允許從內部生成進程)而不是進程。


它可能受到GIL的限制,但是在我的特殊情況下(我都對它們進行了測試),此處Pool創建的外部進程的啟動時間遠遠超過了解決方案的啟動時間。ThreadPool


這真的很容易掉Processes的Threads。在此處或此處閱讀有關如何使用ThreadPool解決方案的更多信息。


查看完整回答
反對 回復 2019-10-08
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

我必須在Python 3.7中使用非守護程序池,并最終改編了接受的答案中發布的代碼。下面是創建非守護程序池的代碼段:


class NoDaemonProcess(multiprocessing.Process):

    @property

    def daemon(self):

        return False


    @daemon.setter

    def daemon(self, value):

        pass



class NoDaemonContext(type(multiprocessing.get_context())):

    Process = NoDaemonProcess


# We sub-class multiprocessing.pool.Pool instead of multiprocessing.Pool

# because the latter is only a wrapper function, not a proper class.

class MyPool(multiprocessing.pool.Pool):

    def __init__(self, *args, **kwargs):

        kwargs['context'] = NoDaemonContext()

        super(MyPool, self).__init__(*args, **kwargs)

由于的當前實現multiprocessing已被廣泛地重構為基于上下文,因此我們需要提供一個NoDaemonContext具有NoDaemonProcessas屬性的類。MyPool然后將使用該上下文,而不是默認上下文。


就是說,我應該警告這種方法至少有兩個警告:


它仍然取決于multiprocessing軟件包的實現細節,因此可能隨時中斷。

為什么有正當的理由multiprocessing說得那么難用非惡魔的過程,其中有許多是解釋在這里。我認為最引人注目的是:

至于允許子線程使用子進程來產生自己的子進程,如果父線程或子線程在子進程完成并返回之前終止,則可能會產生一些僵尸“孫子”。


查看完整回答
反對 回復 2019-10-08
  • 3 回答
  • 0 關注
  • 1516 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號