【发布时间】:2019-01-16 02:01:51
【问题描述】:
我正在使用多处理对一组数据进行大量计算以减少计算时间。它工作得非常好,除了一个小警告,当我让我的侦听器进程编写我的输出时,它以错误的顺序出现,这绝对是糟糕的。我需要它以相同的顺序出现。不知道如何实现这一点。示例代码如下。
import numpy, os, multiprocessing
from multiprocessing.sharedctypes import Value, Array, RawArray, RawValue
from multiprocessing import Process, Lock
def domorestuff(value):
value += value # sample, some other calculation
q.put(value)
return
def dostuff(somevalue):
somevalue += 1 # do some calculation instead of just +=1 here
domorestuff(somevalue)
return
def listener(q):
f = open(os.path.join(outdir, fileout.value), 'w')
while 1:
#print("Listener...", flush=True)
m = q.get()
if(m == 'kill'):
break
#print("Listen write...", flush=True)
f.write(str(m) + '\n')
f.flush()
f.close()
def main():
manager = multiprocessing.Manager()
q = manager.Queue()
pool = multiprocessing.Pool(9)
watcher = pool.apply_async(listener, (q,))
pool.map(dostuff, range(8))
q.put('kill')
pool.close()
我希望它在文件中给我一组线性值,即:
2, 4, 6, 8, 10, 12, 14, 18
但它们每次都以随机顺序出现。不知如何同步事情,当我不使用监听器并且不进行文件写入时,它似乎按线程数按顺序加入进程。但很难确定,因为我无法安全地将多个线程的输出写入单个文件。
为了更清楚一点,处理发生在输入文件上,每个线程读取它需要的部分,然后根据处理将输出写入侦听器。但是,如上所述,它不是按顺序排列的,而是随机排列的。
【问题讨论】:
标签: python file queue python-multiprocessing