python3 queue多线程通信

yizhihongxing

在Python3中,queue模块提供了多线程编程时线程间通信常用的同步机制。

1. 简介

在多线程编程中,多个线程之间共同操作同一资源时,可能会出现资源竞争问题,因此需要一种同步机制来保证线程之间的协调和同步。Python中的Queue(队列)类提供了同步机制,通过可阻塞和非阻塞的队列操作方法实现了多线程编程中的同步和协调。

Queue类提供了三种队列实现:

  1. Queue(队列):先进先出(FIFO)的线程安全队列。
  2. LifoQueue(栈):后进先出(LIFO)的线程安全队列。
  3. PriorityQueue(优先级队列):对添加的元素提供优先级排序的线程安全队列。

通过Queue模块提供的接口方法,可以安全地实现多个线程之间的同步操作,从而避免资源竞争和线程阻塞问题。

2. 使用queue实现多线程通信

2.1 阻塞队列

下面是一个生产者(Producer)和消费者(Consumer)模型的例子,这个例子没有使用多线程库来控制执行,但使用了Queue模块的阻塞队列来实现线程间通信。

from queue import Queue

# 队列容量
queue_max_size = 10

# 生产者生产的任务
tasks = range(500)

# 用于控制生产者和消费者的同步
queue = Queue(queue_max_size)

# 生产者函数定义
def producer():
    for t in tasks:
        queue.put(t) # 如果队列已满,会自动阻塞
    queue.put(None) # 用来通知消费者生产结束

# 消费者函数定义
def consumer():
    while True:
        # 如果队列为空,会自动阻塞
        task = queue.get()
        if task is None:
            break
        print(task)

# 消费者线程
consumer_thread = Thread(target=consumer)
consumer_thread.start()

# 生产者线程
producer_thread = Thread(target=producer)
producer_thread.start()

# 等待生产者线程执行结束
producer_thread.join()

# 生产者生产的任务总数为 500,加上结束标识 None
# 消费者正常消费结束时,事实上只打印了 500 个任务的编号

2.2 使用queue实现多任务队列

下面是一个多任务示例,程序为多个任务分配多个进程处理,每个进程都处于独立的线程中,同时利用queue模块实现了多线程之间的通信。

import os
import threading
from queue import Queue

# 存储所有要处理的任务
tasks = ["task1", "task2", "task3", "task4", "task5"]

# 存储所有结果,把所有处理结果都放到一个list中
results = []

# 任务分派函数
def assign_tasks(q):
    for task in tasks:
        q.put(task)

# 任务处理函数
def process_task(q):
    while not q.empty():
        task = q.get()
        result = os.popen(f"python {task}.py").read().strip()
        results.append(result)

# 定义一个线程安全的队列
q = Queue()

# 创建两个线程,分别用于任务分派和任务处理
t1 = threading.Thread(target=assign_tasks, args=(q, ))
t2 = threading.Thread(target=process_task, args=(q, ))

# 启动两个线程
t1.start()
t2.start()

# 等待线程执行完毕
t1.join()
t2.join()

# 输出结果
for i, result in enumerate(results):
    print(f"result{i}: {result}")

上面两个示例都是使用queue模块来实现多线程通信的例子。在这些例子中,使用Queue类来创建一个队列,利用putget等方法来进行经典的生产者消费者模型等操作即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python3 queue多线程通信 - Python技术站

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

相关文章

  • Python读取及保存mat文件的注意事项说明

    Python是很多科研和数据处理工作中常用的编程语言,而.mat文件是MATLAB的默认数据格式。因此,有时候我们需要在Python中读取和保存.mat文件,以下是相关的注意事项和攻略。 1. 读取.mat文件 1.1 安装SciPy库 首先需要安装SciPy库,它是一个开源的Python库,用于科学计算,也包括读写MAT文件的功能。在Python环境中使用…

    python 2023年6月2日
    00
  • 如何在Python中插入数据到Microsoft SQL Server数据库?

    以下是如何在Python中插入数据到Microsoft SQL Server数据库的完整使用攻略,包括安装pyodbc库、连接Microsoft SQL Server数据库、插入数据等步骤。同时,提供了两个示例以便更好理解如何在Python中插入数据到Microsoft SQL Server数据库。 步骤1:安装pyodbc库 在Python中,我们可以使用…

    python 2023年5月12日
    00
  • 跟老齐学Python之集合的关系

    接下来我将详细讲解“跟老齐学Python之集合的关系”的完整攻略。 什么是集合? 集合是Python中的一种数据类型,它是一组无序、唯一的元素。集合的创建方式有两种,分别是使用set()函数和使用花括号{}。下面是两种方式的创建集合代码示例: # 使用 set() 函数创建集合 my_set = set([1, 2, 3, 4, 5]) print(my_s…

    python 2023年5月13日
    00
  • Python入门之字符串操作详解

    Python入门之字符串操作详解 本文将为大家介绍Python字符串的各种操作及使用方法。在Python中,字符串是一种常见的数据类型,我们可以通过字符串来存储和表示文本内容。字符串是不可变的,也就是一旦创建就无法修改它的内容。 字符串的定义 Python中字符串的定义方式有多种,最常见的方式是使用单引号或双引号。 str1 = ‘hello world!’…

    python 2023年5月20日
    00
  • Python xpath,JsonPath,bs4的基本使用

    Python xpath, JsonPath, bs4的基本使用 在本教程中,我们将介绍Python中xpath、JsonPath和bs4的基本使用方法。这些工具可以帮助我们在爬虫过程中解析HTML、XML和JSON数据。我们将提供两个示例,演示如何使用这些工具。 XPath XPath是一种用于在XML文档中定位元素的语言。在Python中,我们可以使用l…

    python 2023年5月15日
    00
  • python之pexpect实现自动交互的例子

    现在为您详细讲解“python之pexpect实现自动交互的例子”的完整攻略。 什么是pexpect pexpect是一个Python模块,它允许你通过spawn创建子程序,并且在子程序端和你的Python脚本端之间实现交互,例如交互式命令行程序。它可以用于自动执行 shell 命令、远程登录等场景中。 安装pexpect 使用pip命令即可安装pexpec…

    python 2023年5月19日
    00
  • python爬虫实例详解

    Python爬虫实例详解 爬虫的基本概念 爬虫是指利用计算机程序自动访问互联网,并从中获取所需信息的一种技术。常见的爬虫应用场景为搜索引擎的抓取,以及各类网站数据的采集与分析。 基本的爬虫流程为:发送请求 -> 解析内容 -> 存储数据。当然,在实际开发中涉及到的细节和问题非常多,下面将通过两个实例进行介绍。 示例一:爬取微博热搜榜 实现步骤 导…

    python 2023年5月14日
    00
  • python hmac模块验证客户端的合法性

    Python HMAC(Hash-based Message Authentication Code)模块是用于进行消息认证的标准算法之一,可以用于验证客户端的合法性。以下是详细的攻略: 1. 理解 HMAC HMAC 算法是基于哈希函数和秘密密钥来验证消息完整性和认证消息发送者的算法。算法采用两个输入: 一个密钥(key) 一个消息(message) 然后…

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