win11 python3.10环境进程通信执行状况及相关问题
下面这段代码在 win11 python3.10环境 不会报错
有一个问题:没有recv.join(),主进程无法正常关闭的原因是什么?
完整代码
# coding:utf-8
"""
这段代码演示了如何使用 Python 的 multiprocessing 模块创建一个进程池,并使用进程池执行多个函数。
具体来说,代码中定义了一个名为 Work 的类,该类用于封装发送和接收消息的过程。其中,send() 方法用于向队列中发送消息,
send_all() 方法用于向队列中发送多个消息,receive() 方法用于从队列中接收消息。在构造函数中,将队列对象传入。
在主程序中,首先创建了一个队列 q,然后创建了一个 Work 实例 work,将队列对象传入构造函数中。接着创建两个子进程 send 和 recv,
分别用于向队列中发送消息和接收消息。最后启动子进程 send 和 recv。
在 send 进程中,循环调用 work.send() 方法,向队列中发送多个消息。在 receive 进程中,循环调用 work.receive() 方法,从队列中接收消息并打印出来。
最后,等待子进程执行完毕后,调用 terminate() 方法来终止 receive 进程。
"""
import time
import json
import multiprocessing
class Work(object):
def __init__(self, q):
self.q = q
def send(self, message):
if not isinstance(message, str):
message = json.dumps(message)
self.q.put(message)
def send_all(self):
for i in range(3):
self.q.put(i)
time.sleep(1)
def receive(self):
while 1:
result = self.q.get()
try:
res = json.loads(result)
except:
res = result
print('recv is %s' % res)
if __name__ == '__main__':
q = multiprocessing.Queue()
work = Work(q)
send = multiprocessing.Process(target=work.send, args=({'name': '小慕'},))
recv = multiprocessing.Process(target=work.receive)
# send_all_p = multiprocessing.Process(target=work.send_all)
# send_all_p.start()
send.start()
# time.sleep(2) # 接收时间和发送时间不同步,只要进程不关闭信息并不会丢失
recv.start()
# send.join() # 在send执行完成前阻塞主进程
# send.close() # send.close()必须在join之前,这样才能关闭执行完成的send。否则如果此时send还在执行中,将报错
# # send.start() # send.close()以后就不能重新start()了
# send_all_p.join() #
# recv.terminate() # 由于recv进程(接收进程)没有终止,导致主程序一直等待中无法关闭,
# 所以在 发送进程执行时间最长的 进程执行join阻塞主进程,待所有发送进程执行完毕后执行recv.terminate()强行关闭recv进程
# 此时主进程可以顺利结束12
收起
正在回答 回答被采纳积分+1
1回答
Python全能工程师
- 参与学习 人
- 提交作业 16421 份
- 解答问题 4469 个
全新版本覆盖5大热门就业方向:Web全栈、爬虫、数据分析、软件测试、人工智能,零基础进击Python全能型工程师,从大厂挑人到我挑大厂,诱人薪资在前方!
了解课程


恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星