python复习--进程相关--.join()
·
一、join 是什么
process.join() 是 multiprocessing.Process 的一个方法,用来 等待子进程结束。
简单理解就是:
主进程在这里“等”子进程执行完。
如果子进程没结束,主进程会 阻塞(暂停执行)。
二、基本用法
process.join()
含义:等待 process 对应的子进程执行完
示例:
# ================= 标准库 =================
import time
from multiprocessing import Process
def worker():
print("子进程开始")
time.sleep(3)
print("子进程结束")
if __name__ == "__main__":
process = Process(target=worker)
process.start()
print("主进程等待子进程结束")
process.join()
print("主进程继续执行")
执行流程:
主进程 start()
↓
子进程运行
↓
主进程 join() 等待
↓
子进程结束
↓
主进程继续执行
输出:
主进程等待子进程结束
子进程开始
子进程结束
主进程继续执行
三、如果不使用 join()
如果不写 join():
process.start()
print("主进程结束")
可能会出现:
主进程结束
子进程开始
子进程结束
或者主进程提前退出。
所以:join() 用来保证任务执行完成
四、join(timeout)
join() 可以设置 最长等待时间。
process.join(timeout=5)
意思:
最多等待 5 秒
如果 5 秒后子进程还没结束:
主进程继续执行
示例:
# ================= 标准库 =================
import time
from multiprocessing import Process
def worker():
time.sleep(10)
print("子进程结束")
if __name__ == "__main__":
process = Process(target=worker)
process.start()
print("等待 3 秒")
process.join(timeout=3)
print("主进程继续执行")
输出:
等待 3 秒
主进程继续执行
因为子进程还没结束。
五、join() 常见使用场景
1. 等待任务执行完成
例如:
- 数据处理
- 文件生成
- 模型训练
process.start()
process.join()
2. 程序退出前等待子进程
确保:
- 日志写完
- 文件保存
- 资源释放
3. 配合 Event 停止后台任务
在实际项目中,经常会有 长期运行的后台进程,例如:
- 日志采集
- 任务监听
- 状态监控
- 数据消费
通常会使用:
Event + join()
来实现 优雅退出。
示例代码
# ================= 标准库 =================
import time
from multiprocessing import Event, Process
def worker(stop_event):
"""后台任务"""
while not stop_event.is_set():
print("子进程正在工作...")
time.sleep(1)
print("子进程收到停止信号,准备退出")
if __name__ == "__main__":
stop_event = Event()
process = Process(target=worker, args=(stop_event,))
process.start()
time.sleep(5)
print("主进程发送停止信号")
# 通知子进程退出
stop_event.set()
# 等待子进程结束
process.join(timeout=10)
print("主进程结束")
执行流程
主进程启动子进程
↓
子进程进入循环任务
↓
主进程调用 stop_event.set()
↓
子进程检测到 stop_event
↓
子进程退出循环
↓
worker() 结束
↓
join() 返回
↓
主进程继续执行
为什么要这样做
相比直接使用:
process.terminate()
这种方式有几个优势:
- 子进程可以 安全释放资源
- 可以 保存日志 / 数据
- 不会导致 文件损坏或状态丢失
因此在实际项目中:
Event + join()
是 最常见的后台进程退出模式。
六、join() + is_alive()(推荐写法)
很多项目会这样写:
self.stop_event.set()
if self.process.is_alive():
self.process.join(timeout=10)
好处:避免 join 不必要等待
七、join() 不会杀死进程
一个常见误解:
join() ≠ terminate()
区别:
| 方法 | 作用 |
|---|---|
| join() | 等待进程结束 |
| terminate() | 强制杀死进程 |
示例:
join() → 等待
terminate() → 杀死
八、总结
process.join() 的作用:
等待子进程执行结束。
特点:
- 会阻塞主进程
- 可以设置 timeout
- 不会终止进程
- 常用于进程生命周期管理
更多推荐
所有评论(0)