multiprocessing.Queue` 通常只能在主模块(即 `if __name__ == "__main__":` 块)中创建和使用。这是因为 `multiprocessing` 模块在 Windows 系统上需要通过 `if __name__ == "__main__":` 块来避免递归导入问题。
from multiprocessing import Queue, Process
def work(queue):
queue.put("我已发送消息到主进程")
if __name__ == "__main__":
# 实例化一个消息通道
queue = Queue()
# 实例化一个进程
process = Process(target=work, args=(queue,))
# 启动子进程
process.start()
print("主进程等待消息")
msg = queue.get()
print("主进程收到消息:", msg)
process.join()
print("主进程结束")
当然 你也可以双向通信
from multiprocessing import Queue, Process
def work(input_queue, output_queue):
input_queue.put("我已发送消息到主进程")
msg = output_queue.get()
print("主进程发送消息已收到", msg)
if __name__ == "__main__":
# 实例化一个消息通道
input_queue = Queue()
output_queue = Queue()
# 实例化一个进程
process = Process(target=work, args=(input_queue, output_queue))
# 启动子进程
process.start()
print("主进程等待消息")
msg = input_queue.get()
print("主进程收到消息:", msg)
output_queue.put("这里是主进程发送消息")
process.join()
print("主进程结束")
还可持续通信
from multiprocessing import Queue, Process
def work(input_queue, output_queue):
while 1:
msg = output_queue.get()
print("主进程发送消息已收到", msg)
if msg == 2:
input_queue.put("关闭")
break
else:
input_queue.put("子进程已收到消息")
if __name__ == "__main__":
# 实例化一个消息通道
input_queue = Queue()
output_queue = Queue()
# 实例化一个进程
process = Process(target=work, args=(input_queue, output_queue))
# 启动子进程
process.start()
print("主进程等待消息")
while 1:
try:
msg = input_queue.get(timeout=1)
except:
msg = "666"
if msg != "关闭":
if msg != "666":
print("主进程收到消息:", msg)
input_msg = int(input("输入数值2退出"))
output_queue.put(input_msg)
else:
print("进程结束")
break
process.join()
print("主进程结束")