Python中的多处理同步问题,double for loop

2024-05-19 10:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

受教程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

Tags: inforgetrangeoutmultiprocessingtempfx
1条回答
网友
1楼 · 发布于 2024-05-19 10:28:19

无论工作进程完成的顺序如何,项都将被添加到队列中。如果你想强制命令,你必须。。。强制命令;-)

Process不适合这样。它们的执行本质上是无序的,从一次运行到下一次运行,顺序很可能会发生变化。在

在这种情况下,可能最简单:首先,将队列完全丢弃。以这样的方式结束您的mp_worker()

return outdict1, outdict2

然后使用Pool。有几种方法可以使用它。最像你现在正在做的事情:

^{pr2}$

现在,获取结果的顺序与任务传递的顺序相同;顺序是强制的。在

注意:从+切换到{}在逻辑上是不必要的,但是将二次时间(在循环迭代次数中)操作减少为摊销线性时间操作。这与多处理无关。somelist = somelist + anotherlist总是更好地编码为somelist.extend(anotherlist)。在

关于操作系统

这里有一个猜测为什么“它在Windows上工作”而不是在Linux上:历史上,在Linux上创建进程比在Windows上便宜(Windows在加速线程方面投入了更多的精力)。这使得进程更有可能在Windows上以相同的顺序结束,当进程执行相同的工作量时。但他们肯定可以在Windows上完成“无序”操作 我也是。在

不管怎样,Python在这方面没有发言权:如果您需要一个特定的顺序,您必须强制执行该顺序。在

相关问题 更多 >

    热门问题