3 回答
TA貢獻1862條經驗 獲得超6個贊
在多處理模塊有一個漂亮的界面使用與進程池或線程。根據您當前的用例,您可能會考慮將其multiprocessing.pool.ThreadPool用于外部Pool,這將導致線程(允許從內部生成進程)而不是進程。
它可能受到GIL的限制,但是在我的特殊情況下(我都對它們進行了測試),此處Pool創建的外部進程的啟動時間遠遠超過了解決方案的啟動時間。ThreadPool
這真的很容易掉Processes的Threads。在此處或此處閱讀有關如何使用ThreadPool解決方案的更多信息。
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說得那么難用非惡魔的過程,其中有許多是解釋在這里。我認為最引人注目的是:
至于允許子線程使用子進程來產生自己的子進程,如果父線程或子線程在子進程完成并返回之前終止,則可能會產生一些僵尸“孫子”。
添加回答
舉報
