首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用multiprocessing.join()并不是阻塞执行

使用multiprocessing.join()并不是阻塞执行
EN

Stack Overflow用户
提问于 2015-07-10 06:06:35
回答 1查看 219关注 0票数 0

这是我运行过的一些代码。我试图确保我的所有进程在我继续执行代码之前完成,但这并没有像我预期的那样发生。

代码语言:javascript
复制
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')

下面是输出的内容:

代码语言:javascript
复制
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“打印不止一次,而且在我的所有四个进程都结束之前,我当然不希望看到它打印出来。我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 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。由于

代码语言:javascript
复制
print('End of Program')

不在if-statement中,它在每次导入调用模块时执行一次,并且由主进程执行一次。

解决方案是简单地将print调用放在if-statement中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31329073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档