首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多处理中将CPU核心分配给python进程?

如何在多处理中将CPU核心分配给python进程?
EN

Stack Overflow用户
提问于 2018-04-24 04:53:51
回答 2查看 4.3K关注 0票数 0

假设我在多核CPU上运行多个python进程(而不是线程)(比如4)。GIL是进程级别,因此特定流程中的GIL不会影响其他流程。

我在这里的问题是,GIL在一个过程中是否只会占据4个核心中的一个核心,还是会占据所有4个核心?

如果一个进程同时锁定所有内核,那么多处理就不应该比python中的多线程更好。如果不是,核心是如何分配给不同的进程的?

作为一个观察,在我的系统是8个内核(4*2,因为超线程),当我运行一个CPU绑定进程时,8个核心中有4个的CPU使用量增加。

简化如下:

运行在4个核心CPU上的4个python线程(在一个进程中)将比执行相同工作的单个线程花费更多的时间(考虑到工作完全是CPU绑定的)。做这个工作量的4种不同的过程会不会减少近4倍的时间?

EN

回答 2

Stack Overflow用户

发布于 2018-04-24 05:06:29

Python不会对将进程或线程绑定到核心做任何事情;它只是把事情留给操作系统处理。当您生成一组独立的进程(或线程,但在Python中很难做到这一点)时,操作系统的调度程序将快速而有效地将它们分散到您的内核中,而不需要您做任何事情(除非有非常严重的病理病例)。

吉尔和这里没有关系。稍后我会讲到这一点,但首先让我们解释一下什么是相关的。

你没有8个核心。您有4个核,每个核都是超螺纹

现代核具有大量的“超级标量”容量。通常情况下,流水线中排队的指令不够独立,无法充分利用这种能力。超线程所做的是允许内核在发生这种情况时从第二个管道中获取其他指令,而这些指令实际上保证是独立的。但是它只允许这一点,而不是需求,因为在某些情况下( CPU通常可以比您更好地决定),缓存局部性的成本将比并行性的收益更糟糕。

因此,根据实际运行的负载,有四个超线程核心,您可能得到充分的800%的CPU使用率,或者您可能只得到400%,或(经常)之间的某个地方。

我假设您的系统配置为向用户报告8个核心,而不是4个,因为这是默认的,而且至少有8个进程或池具有默认的proc计数和至少8个任务--显然,如果所有这些都不是真的,您就不可能获得800%的…使用率

我还假设您没有使用显式锁、其他同步、Manager对象或任何将序列化代码的方法。如果你这样做了,显然你不能得到完全的并行性。

我还假设您没有使用(可变的)共享内存,就像每个人都写到的multiprocessing.Array一样。这可能导致缓存和页冲突,这些冲突几乎与显式锁一样糟糕。

和吉尔有什么关系?如果您在一个进程中运行多个线程,并且它们都是受CPU约束的,并且它们都花费了大部分时间运行Python代码(比方说,大部分时间用于运行释放GIL的numpy操作),那么一次只能运行一个线程。你可以看到:

  • 100%坚持在一个单一的核心,而其余的坐在0%。
  • 100%的乒乓在两个或两个以上的岩心之间,而其余的处于0%。
  • 在两个或多个核心之间100%的乒乓声,而其余的则处于0%,但与一些明显的重叠,其中两个核一次远超过0%。最后一个可能看起来像并行性,但它不是--这只是切换开销变得可见。

但是不是运行多线程,而是运行单独的进程,每个进程都有自己的完全独立的GIL。这就是为什么你看到四个核心在100%而不是仅仅一个。

票数 6
EN

Stack Overflow用户

发布于 2018-04-24 05:06:15

进程到CPU/CPU核心分配由操作系统处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49993687

复制
相关文章

相似问题

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