Python多线程 Queue 模块常见用法

Python多线程 Queue 模块常见用法

多线程编程中,线程之间的通信是经常遇到的问题。Python中的Queue模块可以很好地解决这个问题。本文将详细讲解Queue模块的常用方法和使用场景。

基本用法

Queue模块提供了FIFO队列、LIFO队列,以及优先级队列三种数据结构。

import queue

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

# 创建一个LIFO队列
lifo_queue = queue.LifoQueue()

# 创建一个优先级队列,其中元组的第一个元素为优先级,数字越小,优先级越高
priority_queue = queue.PriorityQueue()

# 将元素放入队列中,队列支持多线程安全,因此可以多个线程同时调用put方法
fifo_queue.put('Python')
lifo_queue.put('Python')
priority_queue.put((1, 'Python'))

# 取出队列中的元素,如果队列为空,get方法会阻塞,直到有元素可以取出
print(fifo_queue.get())
print(lifo_queue.get())
print(priority_queue.get()[1])

运行结果为:

Python
Python
Python

线程间通信

在多线程编程中,常常需要将数据从一个线程传递到另一个线程。Queue模块提供了线程安全的队列,可以很好地解决这个问题。

import queue
import threading

def producer(q):
    for i in range(5):
        q.put(i)
        print('put', i)
    # put方法在队列已满时会阻塞,因此需要调用q.join()等待队列为空
    q.join()

def consumer(q):
    while True:
        data = q.get()
        print('get', data)
        q.task_done()

q = queue.Queue()
t1 = threading.Thread(target=producer, args=(q,))
t2 = threading.Thread(target=consumer, args=(q,))
t1.start()
t2.start()
t1.join()
t2.join()

在该示例中,producer函数向队列中放入数据,consumer函数从队列中取出数据并处理。在主线程中创建两个子线程,分别调用producerconsumer函数。在producer函数中,调用Queue的put方法向队列中放入数据,当队列已满时会阻塞。在consumer函数中,循环调用Queue的get方法取出队列中的元素,当队列为空时会阻塞,直到队列中有元素可以取出。队列的task_done方法可以通知队列,表示该元素已经取出并处理完毕。

运行结果为:

put 0
put 1
put 2
put 3
put 4
get 0
get 1
get 2
get 3
get 4

阻塞式队列

Queue模块提供了阻塞式队列,当队列已满或队列为空时,队列的putget方法会阻塞,直到队列中有元素可取或队列不再已满。以下是一个阻塞式队列的示例:

import queue
import threading
import time
import random

def producer(q):
    while True:
        data = random.randint(0, 10)
        q.put(data)
        print('put', data)
        time.sleep(1)

def consumer(q):
    while True:
        data = q.get()
        print('get', data)
        time.sleep(2)

q = queue.Queue(5) # 创建一个队列,最多可以存放5个元素
t1 = threading.Thread(target=producer, args=(q,))
t2 = threading.Thread(target=consumer, args=(q,))
t1.start()
t2.start()
t1.join()
t2.join()

在该示例中,producer函数无限循环地向队列中放入随机数值,在队列已满时阻塞。consumer函数无限循环地取出队列中的值,在队列为空时阻塞。在主线程中创建producerconsumer两个子线程,分别调用producerconsumer函数,最多只能存放5个元素。

运行结果为:

put 0
get 0
put 1
put 2
get 1
put 10
get 2
put 9
get 10
put 2
get 9
put 7
get 2
put 4
get 7

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多线程 Queue 模块常见用法 - Python技术站

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

相关文章

  • python namedtuple函数的使用

    下面是关于 python namedtuple 函数的使用的完整攻略。 什么是 namedtuple? 在 Python 中,namedtuple 函数是一个工厂函数,用于创建新的命名元组子类。命名元组是一种类似于元组的数据类型,但是具有命名字段。这使得我们可以通过字段名而不是索引访问数据。namedtuple 可以让我们更容易地编写和理解代码,特别是在处理…

    python 2023年6月2日
    00
  • Python namedtuple命名元组实现过程解析

    Python named tuple 命名元组实现过程解析 在 Python 中,元组被广泛使用,因为它们具有不变性(immutable)和可以包含多个值的特性。但是当我们需要给元组中的每个元素起一个名字时,我们就会发现元组没有这个功能。Python 中的 named tuple 就是为了解决这个问题而出现的。 什么是 named tuple? named …

    python 2023年5月14日
    00
  • Python的数据类型与标识符和判断语句详解

    Python的数据类型 在Python中,常见的数据类型包括数字、字符串、列表、元组、字典等。下面详细介绍这些数据类型。 1. 数字类型 在Python中,数字类型包括整型(int)、浮点型(float)和复数(complex)。其中int和float为常用类型,complex一般用于科学计算中。 示例代码: a = 10 # 整型 b = 3.14 # 浮…

    python 2023年5月14日
    00
  • 使用python生成杨辉三角形的示例代码

    生成杨辉三角是一个经典的数学问题。Python可以通过使用循环和列表来生成杨辉三角形。下面是使用Python生成杨辉三角形的完整攻略。 步骤一: 导入必要的库 import math 步骤二:定义生成杨辉三角函数 首先,我们定义一个函数来生成杨辉三角形。该函数的输入参数是一个整数n,指定三角形中的行数。 在此函数中,我们使用列表来保存每一行的杨辉三角数字。然…

    python 2023年5月31日
    00
  • Python爬虫headers处理及网络超时问题解决方案

    Python爬虫headers处理及网络超时问题解决方案 简介 在使用Python进行爬虫开发时,会遇到对于爬虫脚本头部信息的设置和网络超时问题的解决。本文将详细讲述Python爬虫中headers的设置和超时问题的处理方法。 requests库中的headers设置 requests库是一个常用的Python爬虫库,其中的headers参数可以设置HTTP…

    python 2023年5月13日
    00
  • Python中字典与恒等运算符的用法分析

    Python中字典与恒等运算符的用法分析 什么是字典 字典是Python中内置的一种数据类型,也称为“关联数组”或“映射”。字典是由一系列键(key)和对应值(value)组成的无序集合,键和值之间通过“冒号”进行配对,并用“花括号”括起来。 字典的特点: 字典中的键必须唯一且不可变(可以是字符串、数字、元组等,但不能是列表) 键值对可以按任意顺序排列 可以…

    python 2023年5月13日
    00
  • python实现域名系统(DNS)正向查询的方法

    Python实现DNS正向查询攻略 在Python中进行DNS正向查询的方法分为以下几个步骤: 导入socket库:DNS查询需要使用到socket库,首先需要导入该库。 python import socket 构建查询请求:查询请求需要指定要查询的域名和查询类型。查询类型通常为A记录,其对应的数字为1。构建查询请求的方法如下: python def qu…

    python 2023年6月6日
    00
  • 如何在Python中进行性能测试?

    在Python中进行性能测试的方法有很多种,例如时间计时、内存使用、CPU利用率等等。我们可以通过这些指标来评估代码的效率和性能,找出代码中的瓶颈,以便优化代码。 下面是一些在Python中进行性能测试的方法和示例说明: 时间计时 时间计时是最常用的性能测试方法之一,我们可以使用Python的time模块来计算函数或代码块的执行时间。示例代码如下: impo…

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