3 回答

TA貢獻(xiàn)1862條經(jīng)驗 獲得超6個贊
在多處理模塊有一個漂亮的界面使用與進(jìn)程池或線程。根據(jù)您當(dāng)前的用例,您可能會考慮將其multiprocessing.pool.ThreadPool用于外部Pool,這將導(dǎo)致線程(允許從內(nèi)部生成進(jìn)程)而不是進(jìn)程。
它可能受到GIL的限制,但是在我的特殊情況下(我都對它們進(jìn)行了測試),此處Pool創(chuàng)建的外部進(jìn)程的啟動時間遠(yuǎn)遠(yuǎn)超過了解決方案的啟動時間。ThreadPool
這真的很容易掉Processes的Threads。在此處或此處閱讀有關(guān)如何使用ThreadPool解決方案的更多信息。

TA貢獻(xiàn)1719條經(jīng)驗 獲得超6個贊
我必須在Python 3.7中使用非守護(hù)程序池,并最終改編了接受的答案中發(fā)布的代碼。下面是創(chuàng)建非守護(hù)程序池的代碼段:
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)
由于的當(dāng)前實現(xiàn)multiprocessing已被廣泛地重構(gòu)為基于上下文,因此我們需要提供一個NoDaemonContext具有NoDaemonProcessas屬性的類。MyPool然后將使用該上下文,而不是默認(rèn)上下文。
就是說,我應(yīng)該警告這種方法至少有兩個警告:
它仍然取決于multiprocessing軟件包的實現(xiàn)細(xì)節(jié),因此可能隨時中斷。
為什么有正當(dāng)?shù)睦碛蒻ultiprocessing說得那么難用非惡魔的過程,其中有許多是解釋在這里。我認(rèn)為最引人注目的是:
至于允許子線程使用子進(jìn)程來產(chǎn)生自己的子進(jìn)程,如果父線程或子線程在子進(jìn)程完成并返回之前終止,則可能會產(chǎn)生一些僵尸“孫子”。
添加回答
舉報