【问题标题】:Muti-core parallel computing over a for loop in python-3.xpython-3.x中for循环上的多核并行计算
【发布时间】:2020-01-03 09:28:46
【问题描述】:

我有一个简单的for 循环,它打印一个从 1 到 9999 的数字,中间有 5 秒的睡眠时间。代码如下:

import time

def run():
    length = 10000
    for i in range(1, length):
        print(i)
        time.sleep(5)
run()

我想申请 multiprocessing 以与多核同时运行 for 循环。所以我修改了上面的代码,取了 5 个核心:

import multiprocessing as mp
import time

def run():
    length = 10000
    for i in range(1, length):
        print(i)
        time.sleep(5)

if __name__ == '__main__':
        p = mp.Pool(5)
        p.map(run())
        p.close()

运行该作业没有问题,但它似乎没有与 5 个内核并行运行。我怎样才能让代码按预期工作?

【问题讨论】:

    标签: python-3.x for-loop parallel-processing multiprocessing


    【解决方案1】:

    首先,您正在运行相同的 1..9999 循环 5 次,其次,您正在执行 run 函数,而不是将其传递给 .map() 方法。

    您必须在将队列传递给Pool 实例之前准备好队列,以便所有 5 个工作人员处理同一个队列:

    import multiprocessing as mp
    import time
    
    def run(i):
        print(i)
        time.sleep(5)
    
    if __name__ == '__main__':
        length = 10000
        queue = range(1, length)
        p = mp.Pool(5)
        p.map(run, queue)
        p.close()
    

    请注意,它将按照documentation 中的说明无序处理数字。例如,worker #1 将处理1..500,worker #2 将处理501..1000 等等:

    此方法将可迭代对象分割成多个块,将它们作为单独的任务提交给进程池。这些块的(近似)大小可以通过将 chunksize 设置为正整数来指定。

    如果您想将数字处理更相似到单线程版本,请将chunksize 设置为1

    p.map(run, queue, 1)
    

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多