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全能工程师
- 参与学习 人
- 提交作业 16247 份
- 解答问题 4470 个
全新版本覆盖5大热门就业方向:Web全栈、爬虫、数据分析、软件测试、人工智能,零基础进击Python全能型工程师,从大厂挑人到我挑大厂,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星