python多处理process.join()永远等待

时间:2015-09-07 22:42:42

标签: python multiprocessing

我是Python多处理的新手,对于我的生活,我无法想象这一点。基本上我有一个任务,需要花费相当长的时间,我需要反复做几百次。每次我修改流程的公共资源。 所以我想分批启动4个进程等待它们完成,然后启动接下来的4个进程。 这是我的主要功能

lock = Lock() #global defined at the start of my file
myObj = MyObj()
processes = []
for num in range(1,100):
    if len(processes) < 5:
        p = Process(target=myObj.longFunc, args =())
        p.start()
        processes.append(p)
    else:
        for proc in processes:
            proc.join()
        processes = []

这是MyObj.longFunc功能:

def longFunc:
    lock.acquire()
    #Do stuff on common resourse which is a multiprocessing.Queue object
    lock.release()
    #Do more stuff
    print 'process should return'
    return 0

我得到以下输出:

process should return
process should return
process should return
process should return
process should return

然后程序就在那里'永远'等待。 输出是否意味着流程已完成运行并且应创建下一批流程?我错过了什么 提前致谢!抱歉,如果这是一个愚蠢的问题我是一个新手:)

1 个答案:

答案 0 :(得分:1)

使用以下代码示例尝试模仿您的问题,我成功执行并返回程序(Python 2.7.7):

from multiprocessing import Process, Lock

lock = Lock()

class MyObj():
    def longFunc(self):
        lock.acquire()
        #Do stuff on common resourse which is a multiprocessing.Queue object
        lock.release()
        print "process should return"
        return 0

myObj = MyObj()
processes = []
x = 0

for num in range(1,100):
    if len(processes) < 5:
        p = Process(target=myObj.longFunc, args =())
        p.start()
        processes.append(p)
    else:
        for proc in processes:
            proc.join()
            x += 1
            print x, " joined"
        processes = []

这表明问题不在于您启动和加入线程的方式,而在于您的程序的其他部分。

作为一个注释,我注意到这个程序只到80 joined,因为你的循环占用了一些循环加入线程而不是启动它们,这可能是也可能不是预期的行为。