这是我运行过的一些代码。我试图确保我的所有进程在我继续执行代码之前完成,但这并没有像我预期的那样发生。
import sys
import multiprocessing as mp
import time
import random
def testJoin(argin):
name = mp.current_process().name
exStartTime = time.time()
time.sleep(argin * random.random())
print(name + ' took %d seconds' %(time.time() - exStartTime))
sys.stdout.flush()
if __name__ == '__main__':
instances = [10, 10, 10, 10]
jobs = []
for k in instances:
p = mp.Process(target = testJoin, args = (k,))
jobs.append(p)
p.start()
p.join()
print('End of Program')下面是输出的内容:
End of Program
Process-4 took 1 seconds
End of Program
End of Program
Process-2 took 4 seconds
End of Program
Process-1 took 9 seconds
End of Program
Process-3 took 9 seconds我感到困惑的是,我不希望看到"End of Program“打印不止一次,而且在我的所有四个进程都结束之前,我当然不希望看到它打印出来。我遗漏了什么?
发布于 2015-07-10 06:27:21
您所描述的行为在Unix下不会发生,但在Windows下会发生。Windows缺少os.fork,所以为了启动子进程,multiprocessing starts a new Python interpreter and imports the calling module。
导入时的if __name__ == "__main__" protects code from getting executed。由于
print('End of Program')不在if-statement中,它在每次导入调用模块时执行一次,并且由主进程执行一次。
解决方案是简单地将print调用放在if-statement中。
https://stackoverflow.com/questions/31329073
复制相似问题