首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows上的Multiprocessing.pool.Pool : CPU限制为63?

Windows上的Multiprocessing.pool.Pool : CPU限制为63?
EN

Stack Overflow用户
提问于 2020-12-11 14:06:19
回答 1查看 1.4K关注 0票数 1

当使用超过63个核心的python的multiprocessing.pool.Pool时,我得到一个ValueError

代码语言:javascript
复制
from multiprocessing.pool import Pool

def f(x):
    return x

if __name__ == '__main__':
    with Pool(70) as pool:
        arr = list(range(70))
        a = pool.map(f, arr)
        print(a)

输出:

代码语言:javascript
复制
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Users\fischsam\Anaconda3\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\fischsam\Anaconda3\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\fischsam\Anaconda3\lib\multiprocessing\pool.py", line 519, in _handle_workers
    cls._wait_for_updates(current_sentinels, change_notifier)
  File "C:\Users\fischsam\Anaconda3\lib\multiprocessing\pool.py", line 499, in _wait_for_updates
    wait(sentinels, timeout=timeout)
  File "C:\Users\fischsam\Anaconda3\lib\multiprocessing\connection.py", line 879, in wait
    ready_handles = _exhaustive_wait(waithandle_to_obj.keys(), timeout)
  File "C:\Users\fischsam\Anaconda3\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 72
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]

这个计划似乎运行得很好,其结果与我所期望的一模一样。我能忽略ValueError

背景:我在googled上搜索了这个问题,这似乎与Windows (_winapi.WaitForMultipleObjects)的限制有关;参见here。建议的解决办法是将使用过的核心数量限制在63个。这是不令人满意的,因为我想在我的服务器上100+内核。我真的需要限制核心吗?为什么?有解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-12-14 14:03:20

有趣的是,当我从PrcocessPoolExecutor(max_workers=70)模块中查看问题是否仍然存在时,我得到了ValueError: max_workers必须是<= 61,程序在提交任何作业之前都会立即终止。这强烈地暗示了一个无法回避的限制。然而,您的程序在得到异常后从来不会终止和挂起。在我的有8个核心的计算机上,如果我指定任何大于60 (而不是61或63)工作人员的数字,不管我是使用multiprocessing.Pool还是concurrent.futures.ProcessPoolExecutor,它都会挂起。找出机器上允许它正常终止而不产生异常的最大工人数,并坚持它。

代码语言:javascript
复制
from concurrent.futures import ProcessPoolExecutor

def f(x):
    return x

if __name__ == '__main__':
    with ProcessPoolExecutor(max_workers=70) as executor:
        a = list(executor.map(f, range(70)))
        print(a)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65252807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档