回想起在参考代码中队列有两类:torch.multiprocessing.Queue,queue.Queue。前者用在多进程里,作为多进程中target的参数;后者用在多线程中,作为多线程中target的参数。于是在代码中用前者替换后者,程序正常运行。
以一个案例来理解进程间通信
import random
import time
from multiprocessing import Process,Queue
# from queue import Queue
# 队列有两类:torch.multiprocessing.Queue,queue.Queue。
# 前者用在多进程里,作为多进程中target的参数;后者用在多线程中,作为多线程中target的参数。
class WriteProcess(Process):
""" 写的进程 """
def __init__(self, q, *args, **kwargs):
self.q = q
super().__init__(*args, **kwargs)
def run(self):
ls = [
'第1行内容',
'第2行内容',
'第3行内容',
'第4行内容',
'第5行内容',
]
for line in ls:
print('写入内容:{0}'.format(line))
self.q.put(line)
# 每写入一次,休息1-5秒
time.sleep(random.randint(1, 5))
class ReadProcess(Process):
""" 读取内容的进程 """
def __init__(self, q, *args, **kwargs):
self.q = q
super().__init__(*args, **kwargs)
def run(self):
while True:
content = self.q.get()
print('读取到的内容:{0}'.format(content))
if __name__ == '__main__':
q = Queue()
t_write = WriteProcess(q)
t_write.start()
t_read = ReadProcess(q)
t_read.start()
t_write.join()
t_read.terminate()