晚上好🌙🌙🌙
本答案参考通义千问
你提供的代码看起来逻辑上是正确的,但根据你的描述,“任务1和task2不打印,也不报错”,这说明程序虽然没有报错,但任务并没有真正运行。我们来分析可能的原因,并给出解决方案。
问题分析
1. 主进程提前退出
在使用 multiprocessing.Process 时,如果主进程(即 if __name__ == '__main__': 块)执行完毕,那么它会自动终止所有子进程,即使这些子进程还在运行中。
在你的代码中,主进程在启动两个子进程后,立即退出了,导致子进程被强制终止,因此任务不会打印任何内容。
关键点: 主进程执行完 if __name__ == '__main__': 后就结束了,子进程还没来得及运行就被终止了。
2. 子进程没有阻塞主进程
由于主进程没有等待子进程完成,它会直接退出,导致子进程被系统终止。
解决方案
✅ 重点解决方案:
你需要让主进程等待子进程结束,或者至少保持主进程运行一段时间,以便子进程有机会执行。
方法一:使用 join() 等待子进程
from multiprocessing import Process
from time import sleep
def task1():
while True:
sleep(1)
print('任务1运行中...')
def task2():
while True:
sleep(1)
print('任务2运行中......')
if __name__ == '__main__':
try:
p1 = Process(target=task1, name='任务一')
p1.start()
p2 = Process(target=task2, name='任务二')
p2.start()
# 让主进程等待子进程
p1.join()
p2.join()
except Exception as e:
print(f"Process error: {e}")
加粗说明: 使用 join() 是最常见、最安全的方式,确保主进程不会提前退出,从而保证子进程能正常执行。
方法二:使用 sleep() 暂停主进程
如果你只是想测试一下,可以简单地让主进程暂停几秒,给子进程运行的时间:
from multiprocessing import Process
from time import sleep
def task1():
while True:
sleep(1)
print('任务1运行中...')
def task2():
while True:
sleep(1)
print('任务2运行中......')
if __name__ == '__main__':
try:
p1 = Process(target=task1, name='任务一')
p1.start()
p2 = Process(target=task2, name='任务二')
p2.start()
# 让主进程等待几秒钟
sleep(5) # 5秒后退出
except Exception as e:
print(f"Process error: {e}")
加粗说明: 这种方式适合调试,但不推荐用于生产环境,因为无法精确控制子进程的生命周期。
有序列表总结问题原因与解决方法
-
主进程提前退出
- 原因:主进程在启动子进程后立刻退出,导致子进程被强制终止。
- 解决:使用
join() 或 sleep() 阻止主进程过早退出。
-
子进程没有阻塞主进程
- 原因:主进程未等待子进程完成,导致子进程未运行。
- 解决:调用
p1.join() 和 p2.join()。
-
长时间运行的任务未被中断
- 原因:
task1 和 task2 是无限循环,如果没有退出机制,程序会一直运行。 - 解决:添加退出条件或使用
Ctrl+C 终止程序。
修改后的代码示例(推荐)
from multiprocessing import Process
from time import sleep
def task1():
for i in range(5): # 限制任务次数,避免无限循环
sleep(1)
print('任务1运行中...')
def task2():
for i in range(5):
sleep(1)
print('任务2运行中......')
if __name__ == '__main__':
try:
p1 = Process(target=task1, name='任务一')
p1.start()
p2 = Process(target=task2, name='任务二')
p2.start()
# 等待子进程完成
p1.join()
p2.join()
except Exception as e:
print(f"Process error: {e}")
加粗说明: 上面的修改版本添加了有限次循环,防止无限运行,同时使用 join() 确保主进程等待子进程完成。
如有其他问题,欢迎继续提问!