Python多进程通信Queue、Pipe、Value、Array实例

下面我详细讲解一下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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python编程实现输入某年某月某日计算出这一天是该年第几天的方法

    下面是Python编程实现输入某年某月某日计算出这一天是该年第几天的方法: 步骤一:获取用户输入的年月日 首先,我们需要从用户输入中获取年、月、日这三个值。在Python中,可以使用input()函数来获取用户输入信息,代码如下: year = int(input("请输入年份:")) month = int(input("请输…

    python 2023年6月2日
    00
  • pip报错“OSError: [Errno 13] Permission denied: ‘/usr/local/lib/python3.6/dist-packages/pip/_internal/utils’”怎么处理?

    当使用 pip 命令时,可能会遇到 “ModuleNotFoundError: No module named ‘pip._vendor.chardet'” 错误。这个错误通常是由于 pip 安装不完整或者 pip 版本不兼容导致的。以下是详细讲解 pip 报错 “ModuleNotFoundError: No module named ‘pip._vend…

    python 2023年5月4日
    00
  • 彻底理解Python list切片原理

    以下是“彻底理解Python list切片原理”的完整攻略。 1. 什么是Python list切片 Python中的list切片是一种用于获取列表中子集的方法。它使用[start:stop:step]的语法,其中start是起始索引,stop是结束索引(不包括该索引),step是步长。如果省略start,则默认为0;如果省略stop,则默认为列表的长度;如…

    python 2023年5月13日
    00
  • Python实现批量读取HDF多波段栅格数据并绘制像元直方图

    Python实现批量读取HDF多波段栅格数据并绘制像元直方图的攻略可以分为以下几个步骤: 1. 安装相关Python库 在Python中,我们可以使用h5py库来读取HDF格式的多波段栅格数据;使用numpy、matplotlib库来绘制像元直方图。 如果你还没有安装这些库,请先使用pip等工具进行安装: pip install h5py pip insta…

    python 2023年5月14日
    00
  • 如何安装并使用conda指令管理python环境

    安装conda: 安装Anaconda:可以从官网下载对应系统版本的Anaconda安装包,双击安装包即可安装。安装完成后,在命令行中输入conda –version,可以查看是否安装成功。 安装Miniconda:可以从官网下载对应系统版本的Miniconda安装包,双击安装包即可安装。安装完成后,在命令行中输入conda –version,可以查看是…

    python 2023年5月18日
    00
  • Python集合set()使用的方法详解

    Python集合set()使用的方法详解 什么是集合set() python中的集合是一种无序的不重复元素的集合,它是通过大括号{}或set()函数创建的。 创建一个集合 可以通过下述两种方式来创建一个集合: 使用大括号{}: my_set = {1, 2, 3} print(my_set) 输出结果: {1, 2, 3} 使用set()函数: my_set…

    python 2023年5月13日
    00
  • 使用 Python 合并多个格式一致的 Excel 文件(推荐)

    下面是使用Python合并多个格式一致的Excel文件的完整实例教程。 环境准备 在进行本例子之前,请确保已经安装 Python 和 Pandas 库。 步骤一:导入必要的库 在此之前,你需要了解 Pandas 模块。 Pandas 是一个数据分析的 Python 库, 它可以用来清洗、处理和分析数据。 import pandas as pd import …

    python 2023年5月14日
    00
  • python图片指定区域替换img.paste函数的使用

    Python使用img.paste函数进行图片指定区域替换的完整攻略 简介 Python中的PIL库提供了丰富的图像处理功能,其中img.paste()函数可以用于替换图像的指定区域。 在使用img.paste()函数时,需要提供以下参数: img.paste(im, box, mask=None) 其中,参数说明如下: im: 用于替换的另一张图像。 bo…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部