Python multiprocessing中join()方法的作用与阻塞机制详解
本文深入解析Python multiprocessing模块中join()方法的核心作用。通过对比代码实践,阐明join()如何阻塞主进程以等待子进程结束,实现进程间的同步。文章展示了默认使用join、移除所有join以及仅对部分进程调用join三种场景下的执行顺序差异,帮助开发者掌握子线程/子进程启动与等待的正确时序,避免资源竞争或逻辑错误。
前言与背景
前言
在复习Python多进程语法的过程中,发现对join()方法的理解尚不够深入。本文将通过具体的代码实践,进一步剖析join()的工作机制,以加深对其功能的认识。
multiprocessing是Python提供的跨平台多进程模块,旨在充分利用多核CPU资源以提升程序运行效率。该模块支持子进程创建、进程间通信及共享数据,并提供了Process、Queue、Pipe、Lock等同步组件。本文重点探讨join()方法,其他组件的功能将在后续文章中逐步介绍。
join()方法的核心机制
动手实践
代码实践与结果分析
join()方法的主要功能是在当前代码位置阻塞主进程,直到调用该方法的子进程执行完毕,主进程才会继续执行后续的代码逻辑。
# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/7/30 11:20 AM
func:
"""
from multiprocessing import Process
import os
import time
def now():
return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
def func_1(name):
print(now() + ' Run child process %s (%s)...' % (name, os.getpid()))
time.sleep(4)
print(now() + ' Stop child process %s (%s)...\n' % (name, os.getpid()))
def func_2(name):
print(now() + ' Run child process %s (%s)...' % (name, os.getpid()))
time.sleep(8)
print(now() + ' hello world!')
print(now() + ' Stop child process %s (%s)...\n' % (name, os.getpid()))
if __name__ == '__main__':
print ('Parent process %s.' % os.getpid())
p1 = Process(target=func_1, args=('func_1',))
p2 = Process(target=func_2, args=('func_2',))
print now() + ' Process start.'
p1.start()
p2.start()
p1.join()
p2.join()
print now() + ' Process end .'
输出结果

结果显示
从输出结果可以看出,主进程打印的“Process end.”是在func_1和func_2两个子进程均执行结束后才出现的。
2.2 移除join()函数的情况
if __name__ == '__main__':
print ('Parent process %s.' % os.getpid())
p1 = Process(target=func_1, args=('func_1',))
p2 = Process(target=func_2, args=('func_2',))
print now() + ' Process start.'
p1.start()
p2.start()
print now() + ' Process end .'
结果如下:

2.3 仅移除func_2的join()
if __name__ == '__main__':
print ('Parent process %s.' % os.getpid())
p1 = Process(target=func_1, args=('func_1',))
p2 = Process(target=func_2, args=('func_2',))
print now() + ' Process start.'
p1.start()
p2.start()
p1.join() ### 在p1 执行完之后 。不等待p2 执行,主进程结束。
print now() + ' Process end .'
结果如下:

结果显示,主线程打印“Process end”的时机是在func_1执行结束后立即输出,而没有等待func_2执行完毕。
总结与思考
2.4 小结
在使用多线程或多进程时,通常的操作顺序是先让子进程调用start()启动,随后调用join()。这样做的目的是让主进程等待子进程结束,再继续执行后续的业务逻辑。
思考题
是否可以在每个子进程调用start()之后,立即调用join(),例如采用如下模式:
p1.start()p1.join()p2.start()p2.join()
以上就是Python多进程中join()作用的详细内容,更多关于Python多线程join()的资料请关注本站其他相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













