为了理解多处理的并发性,我写了以下代码,在多个进程之间共享对Queue
的读写:
import time
from multiprocessing import Process, Queue, Pool
class QueueFun():
def writing_queue(self, work_tasks):
while True:
print("Writing to queue")
work_tasks.put(1)
time.sleep(.5)
def read_queue(self, work_tasks):
while True:
print('Reading from queue')
work_tasks.get()
time.sleep(.5)
if __name__ == '__main__':
q = QueueFun()
work_tasks = Queue()
processes = []
write_processes = []
read_processes = []
for i in range(0, 3):
write_processes.append(Process(target=q.writing_queue,
args=(work_tasks,)))
for i in range(0, 3):
read_processes.append(Process(target=q.read_queue,
args=(work_tasks,)))
for p in write_processes:
p.start()
for p in read_processes:
p.start()
print('Joining write_processes')
for p in write_processes:
print('Joining thread' , p)
p.join()
print('Joining read_processes')
for p in read_processes:
p.join()
生产:
Joining write_processes
Joining thread <Process name='Process-1' pid=2432 parent=2430 started>
Writing to queue
Reading from queue
Writing to queue
Writing to queue
Reading from queue
Reading from queue
在我手动终止线程之前。
我对join()
的理解是t.join()
导致主线程等待t
完成。因此,这本质上不是一个顺序调用,因为在调用下一个线程之前,我需要等待每个线程完成。我的目标是并行执行这些过程中的每一个,但它们似乎是按顺序执行的?如何同时启动write_processes
和read_processes
的列表?
更新:
print('Joining read_processes')
的代码未被处理,因为"Joining read_processes"未打印到控制台。但是"从队列读取"被打印到控制台,因此函数read_queue
被启动。为什么跳过代码print('Joining read_processes')
?因此,由于t.join((导致主线程等待t完成。join(?
线程。join((是一个阻塞调用(用于调用线程(,用于等待螺纹完成后再继续。因此,在join((之后启动的每个任务都将按顺序连接到已连接的线程。在您的示例中,它不会使您的过程按顺序进行。您的进程一个接一个地启动,这是正常的,但这并不意味着它们不是在并行中执行的