[英]Python multiprocessing: Simple job split across many processes
提议的代码实际上有效! 我只是在没有显示输出的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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.