受教程multiprocessing factorial的启发,我尝试多处理一个简单的力计算模块。 我主要关心的是队列.get功能检索的顺序与预期的不同。例如,它不是给出[5,4,3,2,1,0,-1,-2,-3,-4,-5],而是根据不同的处理器给出混乱的输出。1) 如何根据进程调用序列追加来自队列的结果?我应该用游泳池,地图,锁之类的东西吗?2) 如何避免内存同步/重写问题?在
def mp_worker(istart, iend, x, out_q1, out_q2):
global_N = len(x)
outdict1 = []
outdict2 = []
k = 0
for i in range(istart,iend,1):
temp_FX = 0
temp_FY = 0
for j in range(global_N):
if i != j:
temp_FX = temp_FX + (x[j]-x[i])
temp_FY = temp_FY + (x[j]-x[i])
outdict1.append(temp_FX)
outdict2.append(temp_FY)
k = k + 1
out_q1.put(outdict1)
out_q2.put(outdict2)
def mp_factorizer( nprocs):
x = mem.x
FORCE = mem.FORCE
N = len(FORCE)
out_q1 = multiprocessing.Queue()
out_q2 = multiprocessing.Queue()
chunksize = int(math.ceil(N / float(nprocs)))
procs = []
for i in range(nprocs):
istart = chunksize * i
iend = chunksize * (i + 1)
p = multiprocessing.Process(
target=mp_worker,
args=(istart, iend, x, out_q1, out_q2))
procs.append(p)
p.start()
# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultdict1 = []
resultdict2 = []
for i in range(nprocs):
resultdict1 = resultdict1 + out_q1.get()
resultdict2 = resultdict2 + out_q2.get()
# Wait for all worker processes to finish
for p in procs:
p.join()
return resultdict1
无论工作进程完成的顺序如何,项都将被添加到队列中。如果你想强制命令,你必须。。。强制命令;-)
Process
不适合这样。它们的执行本质上是无序的,从一次运行到下一次运行,顺序很可能会发生变化。在在这种情况下,可能最简单:首先,将队列完全丢弃。以这样的方式结束您的
mp_worker()
:然后使用
^{pr2}$Pool
。有几种方法可以使用它。最像你现在正在做的事情:现在,获取结果的顺序与任务传递的顺序相同;顺序是强制的。在
注意:从}在逻辑上是不必要的,但是将二次时间(在循环迭代次数中)操作减少为摊销线性时间操作。这与多处理无关。
+
切换到{somelist = somelist + anotherlist
总是更好地编码为somelist.extend(anotherlist)
。在关于操作系统
这里有一个猜测为什么“它在Windows上工作”而不是在Linux上:历史上,在Linux上创建进程比在Windows上便宜(Windows在加速线程方面投入了更多的精力)。这使得进程更有可能在Windows上以相同的顺序结束,当进程执行相同的工作量时。但他们肯定可以在Windows上完成“无序”操作 我也是。在
不管怎样,Python在这方面没有发言权:如果您需要一个特定的顺序,您必须强制执行该顺序。在
相关问题 更多 >
编程相关推荐