Python多处理:跨多个进程进行简单的作业拆分



编辑

提议的代码真的起作用了!我只是在一个没有显示输出的IDE中运行它。

我不提这个问题,因为这些评论/答案很有启发性


我需要把一份大工作分配给许多工人。在试图弄清楚如何做到这一点时,我使用了以下简单的示例,其中的代码大多取自这里。基本上,我取一个列表,将其分解为较短的子列表(块(,并要求multiprocessing用一个专门的工作人员打印每个子列表的内容:

import multiprocessing
from math import ceil
# Breaking up the long list in chunks:
def chunks(l, n):
    return [l[i:i+n] for i in range(0, len(l), n)]
# Some simple function 
  def do_job(job_id, data_slice):
      for item in data_slice:
          print("{}_{}".format(job_id, item))

然后我这样做:

if __name__ == '__main__':
    # My "long" list
    l = [letter for letter in 'abcdefghijklmnopqrstuvwxyz']
    my_chunks = chunks(l, ceil(len(l)/4))

在这一点上,my_chunks正如预期的那样:

[['a', 'b', 'c', 'd', 'e', 'f', 'g'],
 ['h', 'i', 'j', 'k', 'l', 'm', 'n'],
 ['o', 'p', 'q', 'r', 's', 't', 'u'],
 ['v', 'w', 'x', 'y', 'z']]

然后:

    jobs = []
    for i, s in enumerate(my_chunks):
        j = mp.Process(target=do_job, args=(i, s))
        jobs.append(j)
    for j in jobs:
        print('starting job {}'.format(str(j)))        
        j.start()

最初,我写这个问题是因为我没有从do_job函数中获得预期的打印输出。

结果当从命令行运行时,代码运行得很好。

也许这是您第一次使用多处理?您是等待流程退出,还是在流程有时间完成作业之前退出主流程?

from multiprocessing import Process
from string import ascii_letters
from time import sleep

def job(chunk):
    done = chunk[::-1]
    print(done)
def chunk(data, parts):
    divided = [None]*parts
    n = len(data) // parts
    for i in range(parts):
        divided[i] = data[i*n:n*(i+1)]
    if len(data) % 2 != 0:
        divided[-1] += [data[-1]]
    return divided

def main():
    data = list(ascii_letters)
    workers = 4
    data_chunks = chunk(data, workers)
    ps = []
    for i in range(4):
        w = Process(target=job, args=(data_chunks[i],))
        w.deamon = True
        w.start()
        ps += [w]
    sleep(2)

if __name__ == '__main__':
    main()

最新更新