一、Queue
这里提到的队列模块大概有三个:
1、from queue import Queue (此模块适用于线程间通信,但不能用于进程间通信)
2、from multiprocessing import Queue (可以用于多进程,但不能用于进程池)
import time
from multiprocessing import Process,Queue
import queue
def producer(queue):
queue.put("a")
time.sleep(2)
def consumer(queue):
time.sleep(2)
data = queue.get()
print(data)
if __name__ == "__main__":
#queue = queue.Queue()
queue = Queue()
my_producer = Process(target=producer,args=(queue,))
my_consumer = Process(target=consumer,args=(queue,))
my_producer.start()
my_consumer.start()
my_producer.join()
my_consumer.join()
#使用queue模块的Queue()会报错
#使用multiprocessing中的Queue(),正确输出a
3、from multiprocessing import Mnage
import time
from multiprocessing import Process,Queue,Pool,Manager
def producer(queue):
queue.put("a")
time.sleep(2)
def consumer(queue):
time.sleep(2)
data = queue.get()
print(data)
if __name__ == "__main__":
#queue = Queue()
queue = Manager().Queue()
pool = Pool()
#pool中的进程间通信需要使用Manager
pool.apply_async(producer,args=(queue,))
pool.apply_async(consumer, args=(queue,))
pool.close()
pool.join()
二、共享变量
共享变量不适用于多进程,进程间的变量是互相隔离的,子进程的全局变量是完全复制一份父进程的数据,对子进程的全局变量修改完全影响不到其他进程的全局变量
def producer(a):
a += 1
time.sleep(2)
def consumer(a):
time.sleep(3)
data = a
print(data)
if __name__ == "__main__":
a = 1
my_producer = Process(target=producer,args=(a,))
my_consumer = Process(target=consumer,args=(a,))
my_producer.start()
my_consumer.start()
my_producer.join()
my_consumer.join()
#输出结果为1
三、管道Pipe(两进程间的通信优先考虑)
import time
from multiprocessing import Process,Queue,Pool,Manager,Pipe
def producer(pipe):
pipe.send("a")
time.sleep(3)
print(pipe.recv())
def consumer(pipe):
time.sleep(2)
data = pipe.recv()
pipe.send("b")
print(data)
if __name__ == "__main__":
#Pipe实现两进程间通信
s_pipe,r_pipe = Pipe()
pool = Pool()
pool.apply_async(producer,args=(s_pipe,))
pool.apply_async(consumer, args=(r_pipe,))
pool.close()
pool.join()
四、Manager
manager中的一些数据结构,dict使用(类似共享变量)
import time
from multiprocessing import Process,Queue,Pool,Manager,Pipe
import queue
def add_data(p_dict,key,value):
p_dict[key] = value
if __name__ == "__main__":
progress = Manager().dict()
first_progress = Process(target=add_data,args=(progress,"a",1))
second_process = Process(target=add_data,args=(progress,"b",2))
first_progress.start()
second_process.start()
first_progress.join()
second_process.join()
print(progress)