我知道有很多关于将多处理结果写入单个文件的栈上交换的文章,我在只读取这些文章之后开发了我的代码。我试图实现的是并行运行“revmapcoord”函数,并使用multiprocess.queue将其结果写入单个文件中。但我在排队等工作时遇到了问题。我的代码:

def RevMapCoord(list):
    "Read a file, Find String and Do something"

def feed(queue, parlist):
    for par in parlist:
        print ('Echo from Feeder: %s' % (par))
        queue.put(par)
    print ('**Feeder finished queing**')

def calc(queueIn, queueOut):
     print ('Worker function started')
     while True:
         try:
             par = queueIn.get(block = False)
             res = RevMapCoord(final_res)
             queueOut.put((par,res))
         except:
             break

def write(queue, fname):
    fhandle = open(fname, "w")
    while True:
         try:
            par, res = queue.get(block = False)
            print >>fhandle, par, res
         except:
            break
    fhandle.close()


feedProc = Process(target = feed , args = (workerQueue, final_res))
calcProc = [Process(target = calc , args = (workerQueue, writerQueue)) for i in range(nproc)]
writProc = Process(target = write, args = (writerQueue, sco_inp_extend_geno))

feedProc.start()
print ('Feeder is joining')
feedProc.join ()
for p in calcProc:
    p.start()
for p in calcProc:
    p.join()
writProc.start()
writProc.join ()

当我运行此代码脚本时,会在“feedproc.start()”步骤处出错。屏幕的最后几行输出显示“feedproc.start()”结尾的print语句:
Echo from Feeder: >AK779,AT61680,50948-50968,50959,6,0.406808,Ashley,Dayne
Echo from Feeder: >AK832,AT30210,1091-1111,1102,7,0.178616,John,Caine
**Feeder finished queing**

但在执行下一行“feedproc.join()”之前挂起。代码不会出错,继续运行,但什么也不做(挂起)。请告诉我我犯了什么错误。

最佳答案

我认为你应该把你的例子精简到最基本的部分。例如:

from multiprocessing import Process, Queue

def f(q):
    q.put('Hello')
    q.put('Bye')
    q.put(None)

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    with open('file.txt', 'w') as fp:
        while True:
            item = q.get()
            print(item)
            if item is None:
                break
            fp.write(item)
    p.join()

这里我有两个过程(主过程,一个P)。p将字符串放入由主进程检索的队列中。当主进程没有发现(我用来表示“我完成了”的一个哨兵)时,它就中断了循环。
将其扩展到许多进程(或线程)是很简单的。

08-04 06:10