在Python 3.8中,
concurrent.futures.ProcessPoolExecutor
已更新以限制在Windows上可使用的最大工作程序(进程)数量为61。关于原因,请参见此处和此处,但据我所知:
- 在Windows上,
multiprocessing
调用Windows API函数WaitForMultipleObjects
,用于等待进程完成。它最多可以等待63个对象,减去结果队列读取器和线程唤醒读取器,因此限制为61。(即Windows使用一个线程跟踪进程)。
(请参见此SO问题)
然而,multiprocessing
仍然使用os.cpu_count()
。它首先抛出一个Value Error
,但随后继续使用我的CPU核心的100%。例如:
Exception in thread Thread-N:
Traceback (most recent call last):
File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\multiprocessing\pool.py", line 519, in _handle_workers
cls._wait_for_updates(current_sentinels, change_notifier)
File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\multiprocessing\pool.py", line 499, in _wait_for_updates
wait(sentinels, timeout=timeout)
File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\multiprocessing\connection.py", line 879, in wait
ready_handles = _exhaustive_wait(waithandle_to_obj.keys(), timeout)
File "C:\Users\username\AppData\Local\Programs\Python\Python38\lib\multiprocessing\connection.py", line 811, in _exhaustive_wait
res = _winapi.WaitForMultipleObjects(L, False, timeout)
ValueError: need at most 63 handles, got a sequence of length 98
我的机器有96个核心。这个“错误”真的是一个错误吗?如果不是,我应该只使用multiprocessing
模块而不是concurrent.futures
模块吗?后者会限制我的CPU使用率在61个核心。
编辑:我怀疑这是一个错误,因为我认为multiprocessing
将继续等待抛出错误的进程完成。如果我不限制核心数,情况似乎是这样的(程序在CPU使用率下降后就会停滞)。但是,我不确定这是否真的是一个错误。
multiprocessing.Pool
没有相应地进行调整。 - A. Hendry