python `queue` 模块提供了同步的、线程安全的队列类

在Python中,queue 模块提供了同步的、线程安全的队列类,这使得在多线程环境下共享数据变得简单。下面是一个使用 queue.Queue 的并发编程示例,其中使用了 threading 模块来创建多个线程,这些线程将向队列中添加元素并从队列中取出元素。

python 复制代码
import queue
import threading
import time
import random

# 定义一个工作函数,用于模拟生产者(向队列中添加数据)和消费者(从队列中取出数据)
def worker(q, job_type):
    while True:
        item = random.randint(1, 100)  # 模拟生成数据
        if job_type == 'producer':
            q.put(item)  # 生产者向队列中添加数据
            print(f'{threading.current_thread().name} 生产了 {item}')
            time.sleep(random.random())  # 模拟耗时操作
        elif job_type == 'consumer':
            item = q.get()  # 消费者从队列中取出数据
            q.task_done()  # 表示队列中之前入队的一个任务已经完成
            print(f'{threading.current_thread().name} 消费了 {item}')
            time.sleep(random.random())  # 模拟耗时操作

# 创建一个队列
q = queue.Queue()

# 创建并启动生产者线程
for i in range(2):  # 假设有两个生产者
    t = threading.Thread(target=worker, args=(q, 'producer'), name=f'生产者-{i+1}')
    t.daemon = True  # 设置为守护线程,主线程结束时守护线程也会结束
    t.start()

# 创建并启动消费者线程
for i in range(3):  # 假设有三个消费者
    t = threading.Thread(target=worker, args=(q, 'consumer'), name=f'消费者-{i+1}')
    t.daemon = True  # 设置为守护线程
    t.start()

# 主线程等待所有任务完成(这里假设所有任务都会很快完成,实际情况中可能需要更复杂的同步机制)
q.join()  # 等待队列中的所有项目都被处理

print("所有任务完成。")

注意

  1. 在这个示例中,我使用了 random.randint(1, 100) 来模拟生产的数据,以及 random.random() 来模拟生产者和消费者的耗时操作。

  2. q.put(item) 用于生产者向队列中添加元素,而 q.get() 用于消费者从队列中取出元素。q.task_done() 表示队列中之前入队的一个任务已经完成,每当消费者线程完成一个元素的消费后,就应当调用这个方法。

  3. 使用了 threading.Thread 来创建线程,并设置了 daemon 属性为 True,这意味着这些线程是守护线程,当主线程结束时,它们也会自动结束。

  4. 使用了 q.join() 方法来等待队列中的所有元素都被处理。但是,需要注意的是,在这个示例中,由于生产者线程是无限循环的(没有明确的退出条件),所以实际上 q.join() 可能永远不会返回,除非在外部有某种机制来停止生产者线程(例如,通过共享变量或使用 threading.Event)。在实际应用中,你可能需要设计更复杂的逻辑来确保生产者线程在适当的时候停止。

  5. 为了简化示例,这里没有包含优雅地关闭线程或队列的代码。在实际应用中,你可能需要实现某种形式的信号机制来通知线程何时停止工作。

相关推荐
fuvuof18 分钟前
函数类型注释和Union联合类型注释
python
龙虎榜小红牛系统23 分钟前
Wordcloud也能生成一个,带html的词云图文件吗??
python·html·wordcloud
多彩电脑2 小时前
Python的tkinter如何把日志弄进文本框(Text)
python·用户界面
小馒头学python2 小时前
【Python爬虫五十个小案例】爬取豆瓣电影Top250
开发语言·爬虫·python
black0moonlight8 小时前
ISAAC Gym 7. 使用箭头进行数据可视化
开发语言·python
程序员黄同学8 小时前
Python 中如何创建多行字符串?
前端·python
苹果酱05678 小时前
windows安装redis, 修改自启动的redis服务的密码
java·开发语言·spring boot·mysql·中间件
一点一木9 小时前
AI与数据集:从零基础到全面应用的深度解析(超详细教程)
人工智能·python·tensorflow
A.sir啊9 小时前
Python知识点精汇:集合篇精解!
python·pycharm
周某人姓周9 小时前
利用爬虫爬取网页小说
爬虫·python