Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-pooling没有';不要使用所有的核心_Python_Multithreading_Performance_Multiprocessing_Remote Server - Fatal编程技术网

Python-pooling没有';不要使用所有的核心

Python-pooling没有';不要使用所有的核心,python,multithreading,performance,multiprocessing,remote-server,Python,Multithreading,Performance,Multiprocessing,Remote Server,我正在使用来自多处理包(来自多处理.dummy import Pool)的池。 我编写了一个函数,用于读取文本文件并为将来的函数进行预处理。 我有大约20000个这样的文本文件,因此我想并行化这个过程——为此我使用了池。 我在运行代码的远程服务器上有32个内核,因此我尝试打开70个进程(我也尝试了较少的进程,问题仍然存在)-这就是我的系统监视器的外观: 正如你所看到的,32个内核中有16个根本不工作 任何帮助都将不胜感激 正如我在评论中所说,所有结构都旨在使用常规线程模拟多处理接口,这对于测试

我正在使用来自
多处理
包(
来自多处理.dummy import Pool
)的
。 我编写了一个函数,用于读取文本文件并为将来的函数进行预处理。 我有大约20000个这样的文本文件,因此我想并行化这个过程——为此我使用了池。 我在运行代码的远程服务器上有32个内核,因此我尝试打开70个进程(我也尝试了较少的进程,问题仍然存在)-这就是我的系统监视器的外观:

正如你所看到的,32个内核中有16个根本不工作


任何帮助都将不胜感激

正如我在评论中所说,所有结构都旨在使用常规线程模拟多处理接口,这对于测试、调试、分析等非常有用。或者,正如官方文档所说:

复制的API,但只不过是模块的包装器

虽然Python(CPython)使用真正的系统线程,因此理论上可以让线程代码在不同的cpu上执行,但由于可怕的GIL,这些线程中没有两个会同时运行。该规则也有例外,tho-所有正在抽象系统调用并等待事件(如I/O)的任务都可以并行执行,但当处理移动到Python域时,它将被GIL锁定,并且在opt code计数器切换其上下文之前不允许继续执行

长话短说,如果您希望通过一个池使用多个核心,请不要使用中的改编和抽象(对于其他
虚拟
包也是如此),而使用根模块本身-在您的情况下


话虽如此,考虑到模块没有池接口,我经常发现自己使用
多处理.dummy.pool
(或
多处理.pool.ThreadPool
)来代替I/O繁重的东西(即不受GIL限制),因为共享内存比共享处理及其产生的开销更重要。即使切换到,如果在抓取文件时不进行繁重的后处理,也很可能不会注意到太多的差异。

多处理.dummy下的所有包都旨在通过多线程、GIL和所有jazz来模拟多处理的行为。使用常规的
多处理.Pool
。存储速度也很可能不够快,无法跟上其中的几个核心。除非它们都已经在RAM中,否则这将是一个I/O绑定的任务。您确定这是一个与python相关的问题,而不是与操作系统相关的问题吗?默认情况下,多处理中没有任何东西会阻止进程在特定内核上运行(尽管您可以为它设置亲缘关系),如果您确实有70个进程在运行,这可能意味着操作系统有问题scheduling@zwer谢谢你可以写下来作为答案,我会很高兴地接受它。。。