一、Queue
- from queue import Queue (此模块适用于线程间通信,但不能用于进程间通信)
- 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() """ 运行结果: a Process finished with exit code 0 """ """ 使用queue模块的Queue()会报错 使用multiprocessing中的Queue(),正确输出a """
- from multiprocessing import Manager(实例化后调用Queue()可以用于多进程的进程池)
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__": #pool中的进程间通信需要先实例化Manager,再调用Queue() queue = Manager().Queue() pool = Pool() pool.apply_async(producer,args=(queue,)) pool.apply_async(consumer, args=(queue,)) pool.close() pool.join() """ a Process finished with exit code 0 """
二、共享变量
共享变量不适用于多进程,进程间的变量是互相隔离的,子进程的全局变量是完全复制一份父进程的数据,对子进程的全局变量修改全影响不到其他进程的全局变量。
import time
from multiprocessing import Process
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
Process finished with exit code 0
"""
三、管道Pipe(两进程间的通信优先考虑)
import time
from multiprocessing import Pool, 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()
"""
运行结果:
a
b
Process finished with exit code 0
"""
四、Manager(接口用法类似于threading接口用法)
from multiprocessing import Process, Queue, Pool, Manager, Pipe
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)
"""
运行结果:
{'b': 2, 'a': 1}
Process finished with exit code 0
"""