Python多处理只使用3个内核,总共130%的CPU?

Python多处理只使用3个内核,总共130%的CPU?,python,Python,我的机器上有24个内核,但我无法让它们全部运行。当Itop时,只有3个进程正在运行,通常只有一个进程达到100%的CPU,另外两个进程达到30% 我已经阅读了这个网站上所有的相关文章,但仍然无法找出我的代码出了什么问题 我如何使用pool的伪代码如下 import multiprocessing as mp def Foo(): pool = mp.Pool(mp.cpu_count()) def myCallbackFun(): pool.map(myFunc

我的机器上有24个内核,但我无法让它们全部运行。当I
top
时,只有3个进程正在运行,通常只有一个进程达到100%的CPU,另外两个进程达到30%

我已经阅读了这个网站上所有的相关文章,但仍然无法找出我的代码出了什么问题

我如何使用
pool
的伪代码如下

import multiprocessing as mp

def Foo():
    pool = mp.Pool(mp.cpu_count())
    def myCallbackFun():
        pool.map(myFunc_wrapper, myArgs)
    optimization(callback=myCallbackFun) # scipy optimization that has a callback function.
使用
pdb
,我在
optimization
之前停止,并检查我是否确实有24名工人

但是当我恢复程序时,
top
告诉我只有三个Python进程在运行。另一件事是,当我
ctrl-c
终止我的程序时,需要中断的工作程序太多了(例如,
PoolWorker-367
)——我按了
ctrl-c
几分钟,但仍然有工作程序在那里。难道不应该只有24名工人吗


如何使我的程序使用所有CPU?

使用多处理Python启动新进程。像你这样的脚本会无限分叉。您需要像这样包装模块的脚本部分:

import multiprocessing as mp

if __name__ == '__main__':
    pool = mp.Pool(24)
    pool.map(myFunc_wrapper, myArgs)
给未来的读者--

正如@mata正确指出的那样

如果涉及到的参数太多,您可能会遇到IO瓶颈 它们很大


这确实是我的情况。尽量减少传递给每个进程的参数的大小。

pool=mp.pool(24)
pool.map(myFunc\u包装,myArgs)
应该这样做如果uuu name uuu=='\uuuu main uu':这样你的脚本就不会无限分叉。如果看不到真实代码的相关部分,就不可能说太多。如果所涉及的参数非常复杂,则可能会遇到IO瓶颈big@mata事实上,这是由于IO瓶颈造成的。当我尽力减少传递的参数时,我可以充分利用我的核心。非常感谢!在实际代码中,
pool=mp.pool(mp.cpu\u count())
实际上是在一个函数中调用的,因此如果中的,则它实际上不在
中。这就是问题所在吗?只有当您的代码中有脚本部分时。如果您的所有代码都包装在函数中,那么这不应该是一个问题。你应该改变你的例子。我明白了,你在哪里调用Foo()?调用树是这样的:`if name=='main':`calls
main()
,它调用
Bar()
,它调用
Foo()
。你是否缺少下划线
\u name\u
\u main\u>