首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有list的pool.map进行Python多处理

使用带有list的pool.map进行Python多处理
EN

Stack Overflow用户
提问于 2019-05-30 08:28:36
回答 1查看 2.9K关注 0票数 3

我正在使用多处理处理编写python代码。下面是代码

代码语言:javascript
复制
import multiprocessing
import os

def square(n):
    #logger.info("Worker process id for {0}: {1}".format(n, os.getpid()))
    logger.info("Evaluating square of the number {0}".format(n))
    print('process id of {0}: {1}'.format(n,os.getpid()))
    return (n * n)

if __name__ == "__main__":
    # input list
    mylist = [1, 2, 3, 4, 5,6,7,8,9,10]

    # creating a pool object
    p = multiprocessing.Pool(4)

    # map list to target function
    result = p.map(square, mylist)

    print(result)

我的服务器中CPU核心的数量是4。如果我使用4个,那么只启动单个进程。一般来说,它应该启动4个单独的过程,对吗?

如果在下面的Pool对象中将值设置为8,则是我得到的响应

代码语言:javascript
复制
process id of 1: 25872

process id of 2: 8132

process id of 3: 1672

process id of 4: 27000

process id of 6: 25872

process id of 5: 20964

process id of 9: 25872

process id of 8: 1672

process id of 7: 8132

process id of 10: 27000

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

这启动了5个单独的进程(25872,1672,27000,20964),尽管只有4个cpu核心。

  1. 我不明白为什么池在值为4时只启动了一个进程,在值为8时启动了5个单独的进程。
  2. 可以用大于CPU核数的值实例化池对象吗?
  3. 另外,如果一个列表包含一百万条记录,那么我们在实例化池对象时应该使用的最佳值是什么?

我已经看过正式的python文档,但是我找不到信息。请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-30 08:40:38

让我们一个接一个回答。

  1. 我不明白为什么池在值为4时只启动了一个进程,在值为8时启动了5个单独的进程。

池启动了4个进程。不要把你拥有的核心数量误认为是进程的数量,是完全独立的。您有5个进程,因为最初的python一个也算在内。因此,您从 python进程开始,它调用池以启动另一个进程,这就产生了5个进程。如果您看到只使用了几个进程,这意味着它们可能能够足够快地终止任务,因此不需要其他进程。

  1. 可以用大于CPU核数的值实例化池对象吗?

是的,确实,您可以实例化任何您想要的数字(尽管可能有某种限制取决于操作系统)。但请注意,这只会使您的CPU超载。下面是更多的解释。

  1. 另外,如果一个列表包含一百万条记录,那么我们在实例化池对象时应该使用的最佳值是什么?

通常情况下,“最优”是CPU的所有核心都完全被池所使用。因此,如果你有4个核心,4个进程将是最好的选择,尽管有时这并不完全像它是一个很好的起始近似。

最后一个音符,

我已经看过正式的python文档,但是我找不到信息。

这并不是特定于python的,它是CS中的一般行为。

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

https://stackoverflow.com/questions/56374465

复制
相关文章

相似问题

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