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

yizhihongxing

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

相关文章

  • 基于python3+OpenCV实现人脸和眼睛识别

    首先讲解一下“基于python3+OpenCV实现人脸和眼睛识别”的完整攻略: 安装 OpenCV首先需要安装 OpenCV 库,可以通过命令行输入以下命令进行安装:pip install opencv-python 获取人脸和眼睛识别的模型文件OpenCV 中自带了人脸和眼睛识别的模型文件,这些文件保存在 opencv/data/haarcascades …

    python 2023年5月18日
    00
  • Python 用compress()过滤

    当我们需要压缩或者过滤掉列表中符合某个条件的元素时,我们可以使用Python内置函数compress()。 compress()函数 compress()函数接受两个参数:第一个参数是一个可迭代的对象;第二个参数是一个可迭代的布尔值序列。compress()会返回一个由可迭代对象中对应布尔值为True的元素所组成的迭代器。 语法如下: compress(da…

    python-answer 2023年3月25日
    00
  • 详解Python的字符串格式化

    详解Python的字符串格式化 字符串格式化是将各个数据类型格式化为字符串的一种操作方式,Python 中有多种格式化的方法,其中最常用的是字符串内插和 format() 方法。 字符串内插 字符串内插是指通过字符串中的占位符将数据插入到字符串中。在 Python 中,常用的字符串内插方式是使用 % 进行占位符替换。 基本用法 下面是一个简单的示例: nam…

    python 2023年6月5日
    00
  • 分析Python中解析构建数据知识

    分析Python中解析构建数据知识是数据分析和爬虫中非常重要的一环,本文将介绍Python中解析构建数据的完整攻略。 网页解析 在进行数据爬取时,我们往往需要通过解析网页来获取所需的数据。Python中常用的网页解析库有如下几种: 1. BeautifulSoup BeautifulSoup是一种HTML和XML的解析库,可以将HTML或XML文档转换成树形…

    python 2023年5月13日
    00
  • python中对正则表达式re包的简单引用方式

    在Python中,re模块提供了对正则表达式的支持。使用re模块,可以方便地进行字符串的匹配、查找、替换和分割等操作。下面是Python中对正则表达式re包的简单引用方式的完整攻略。 正则表达式语法 在使用re模块之前,需要了解正则表达式的语法。正则表达式是一种用于描述字符串模式的语言,它由一些特殊字符和普通字符组成。下面是一些常用的正则表达式特殊字符: .…

    python 2023年5月14日
    00
  • 手把手教你怎么用Python实现zip文件密码的破解

    现在我来为你详细讲解如何用Python实现zip文件密码的破解。 1. 准备工作 在开始之前,你需要安装 pyzipper 库来对 zip 文件进行操作,以及 argparse 库来处理命令行参数。你可以使用以下命令来安装这两个库: pip3 install argparse pyzipper 2. 破解过程 2.1 密码破解函数 我们将使用一个名为 bru…

    python 2023年6月3日
    00
  • python pygame实现滚动横版射击游戏城市之战

    下面我会详细讲解如何使用Python和Pygame库实现滚动横版射击游戏城市之战。 1. 准备工作 安装 Python 和 Pygame 库 准备游戏素材(如背景、角色、敌人、子弹等) 2. 创建游戏窗口 在Pygame中,可以使用pygame.display.set_mode()函数来创建游戏窗口,如下所示: import pygame # 初始化 Pyg…

    python 2023年6月3日
    00
  • 编写每5分钟执行一次的python脚本

    【问题标题】:write python script that is executed every 5 minutes编写每5分钟执行一次的python脚本 【发布时间】:2023-04-04 06:10:01 【问题描述】: 我需要编写一个在启动时自动启动并在树莓派上每 5 分钟执行一次的 Python 脚本。如何才能做到这一点?特别是,我怎样才能避免让脚…

    Python开发 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部