下面我详细讲解一下Python中多进程通信的四个工具:Queue、Pipe、Value和Array的使用方法。
1. Queue
Queue是Python的一个线程安全的队列,可以在多个进程间进行通信。特点是先进先出,可以放置任意类型的数据。
创建Queue
from multiprocessing import Queue
queue = Queue(maxsize=10) # maxsize为队列的最大长度
Queue的基本操作
queue.put(item) # 向队列中插入一个元素
queue.get() # 从队列中取出一个元素
queue.put_nowait(item) # 向队列中插入一个元素,若队列已满,则立即抛出异常
queue.get_nowait() # 从队列中取出一个元素,若队列为空,则立即抛出异常
queue.empty() # 判断队列是否为空
queue.full() # 判断队列是否已满
Queue示例
from multiprocessing import Process, Queue
# 生产者
def producer(queue):
for i in range(10):
print(f'生产者生产了{i}号产品')
queue.put(i)
# 消费者
def consumer(queue):
while True:
if not queue.empty():
item = queue.get()
print(f'消费者消费了{item}号产品')
if __name__ == '__main__':
queue = Queue(maxsize=5) # 创建队列
# 创建生产者进程以及消费者进程
p1 = Process(target=producer, args=(queue,))
p2 = Process(target=consumer, args=(queue,))
p1.start()
p2.start()
p1.join()
p2.terminate()
2. Pipe
Pipe是Python中的一个双向管道,可以实现两个进程之间的通信。
创建Pipe
from multiprocessing import Pipe
conn1, conn2 = Pipe(duplex=True) # duplex表示是否使用双向通信,默认为True
Pipe的基本操作
conn1.send(data) # 往另外一个进程的Pipe中写入数据
conn2.recv() # 从另外一个进程的Pipe中读取数据
conn1.recv() # 从另外一个进程的Pipe中读取数据
conn2.send(data) # 往另外一个进程的Pipe中写入数据
Pipe示例
from multiprocessing import Process, Pipe
# 子进程1
def recv(conn):
print(f'子进程1接收到数据:{conn.recv()}')
# 子进程2
def send(conn):
conn.send('hello, world!')
if __name__ == '__main__':
conn1, conn2 = Pipe() # 创建Pipe,即双向管道
# 创建两个子进程1和子进程2
p1 = Process(target=recv, args=(conn1,))
p2 = Process(target=send, args=(conn2,))
p1.start()
p2.start()
p1.join()
p2.join()
3. Value
Value是Python中的一个进程共享变量,可以在多个进程间进行通信。
创建Value
from multiprocessing import Value
val = Value('i', 0) # i表示数据类型,0为初始值
Value的基本操作
val.value # 获取变量值
val.value = 10 # 修改变量值
Value示例
from multiprocessing import Process, Value
# 子进程1
def update(val):
val.value += 5 # 修改val共享变量的值
print(f'子进程1更新val共享变量,更新后的值为{val.value}')
# 子进程2
def read(val):
print(f'子进程2读取val共享变量的值为{val.value}')
if __name__ == '__main__':
val = Value('i', 0) # 创建共享变量val
# 创建两个子进程1和子进程2
p1 = Process(target=update, args=(val,))
p2 = Process(target=read, args=(val,))
p1.start()
p2.start()
p1.join()
p2.join()
4. Array
Array是Python中的一个进程共享数组,可以在多个进程间进行通信。
创建Array
from multiprocessing import Array
arr = Array('i', [1, 2, 3, 4, 5]) # i表示数据类型,[1,2,3,4,5]为初始值
Array的基本操作
arr[index] # 获取数组指定下标的值
arr[index] = value # 修改数组指定下标的值
Array示例
from multiprocessing import Process, Array
# 子进程1
def update(arr):
for i in range(len(arr)):
arr[i] += 1
print(f'子进程1更新了共享数组,更新后的值为{arr[:]}')
# 子进程2
def read(arr):
print(f'子进程2读取了共享数组的值为{arr[:]}')
if __name__ == '__main__':
arr = Array('i', [1, 2, 3, 4, 5]) # 创建共享数组arr
# 创建两个子进程1和子进程2
p1 = Process(target=update, args=(arr,))
p2 = Process(target=read, args=(arr,))
p1.start()
p2.start()
p1.join()
p2.join()
以上就是Python多进程通信中Queue、Pipe、Value、Array的详细介绍和使用方法,希望能对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多进程通信Queue、Pipe、Value、Array实例 - Python技术站