在 Windows 上 Python 进行多处理时的最大工作数 10

Maximum workers when multiprocessing in Python on Windows 10

为什么我在 Pool 中的最大工人数设置为 60?考虑到我只有 8 个核心 CPU 和 16 个线程,它不应该更低吗?出于某种原因,它接受 60,并且 运行 没问题,甚至没有用完 CPU 的 30%,尽管争夺资源和切换上下文。

一旦我设置为 Pool(61) 或更高的值,我就会收到如下错误:

Exception in thread Thread-4:
Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\threading.py", line 954, in _bootstrap_inner
    self.run()
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\multiprocessing\pool.py", line 519, in _handle_workers
    cls._wait_for_updates(current_sentinels, change_notifier)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\multiprocessing\pool.py", line 499, in _wait_for_updates
    wait(sentinels, timeout=timeout)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\multiprocessing\connection.py", line 884, in wait
    ready_handles = _exhaustive_wait(waithandle_to_obj.keys(), timeout)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python39\lib\multiprocessing\connection.py", line 816, in _exhaustive_wait
    res = _winapi.WaitForMultipleObjects(L, False, timeout)
ValueError: need at most 63 handles, got a sequence of length 82

显然,根据 this,这是一个 Windows 限制。但是为什么?

如果可以超过 CPU 线程限制,为什么 Windows 不允许我达到 80 或 120,考虑到我有 CPU 个空闲周期?如果我在这台机器上安装 Linux,这个限制是否仍然适用?还有其他方法可以避免这种情况吗?使用 Threadripper CPU 的人是否也 运行 在 Windows 上遇到同样的问题?

这是一个 Windows 特定限制,与 WaitForMultipleObjects (the limit is 64MAXIMUM_WAIT_OBJECTS 限制相关联);您可以在回溯中看到最终问题是对 _winapi.WaitForMultipleObjects 的调用;那是 Windows 特定的代码。在 Linux 你应该没有这样的问题。

ways around this limit(它基本上涉及创建要等待的句柄的嵌套层次结构),但它很复杂并且有局限性;显然 Python 关卡代码没有费心使用任何这些解决方法。在 Python 内,如果您想超出限制,我认为您将无法使用多个池。由于限制是在对 WaitForMultipleObjects 的单次调用中可以监视多少句柄,而不是对总进程的限制,因此多个池应该可以正常工作。