当前位置: 首页 > news >正文

Python 线程队列

文章目录

    • Python 中的线程
    • 在 Python 中使用队列限制线程


本篇文章将介绍限制 Python 中的活动线程数。


Python 中的线程

Python 中的线程允许多个执行线程在单个进程中同时运行。 每个线程独立于其他线程运行,允许并发执行并提高性能。

线程对于执行受 I/O 限制或执行时间较长的任务特别有用,因为它允许其他线程在一个线程被阻塞时继续执行。

Python 提供了一个内置的线程模块来创建和管理线程。 模块中的 Thread 类可用于创建新的执行线程,start() 方法可用于开始线程的执行。

join() 方法可用于等待线程完成其执行。

除了 threading 模块,Python 还提供了 concurrent.futures 模块,它为异步执行可调用对象提供了更高级别的接口。 该模块提供 ThreadPoolExecutor 类,可用于创建可用于并行执行可调用对象的工作线程池。

线程可以成为提高 Python 程序性能的强大工具,但应谨慎使用,因为它还会带来复杂性以及竞争条件和其他同步问题的可能性。


在 Python 中使用队列限制线程

Python 中的 Queue 类提供了线程安全和 FIFO(先进先出)数据结构,用于存储需要多线程处理的项。 它可用于协调线程之间的数据流,并限制可同时执行的线程数。

如果我们想限制可以使用队列同时执行的线程数,我们可以使用 Queue 类内部的 maxsize 参数。 这是一个如何使用队列来限制线程总数的示例。

import threading
import queue
from queue import Queue
from threading import Threaddef function_to_be_executed():print(f"Thread {threading.get_ident()} is working")returnq = Queue(maxsize=3)for i in range(10):try:thread = Thread(target=function_to_be_executed)q.put(thread, block=False)except queue.Full:q.get().join(timeout=0)thread = Thread(target=function_to_be_executed)q.put(thread, block=False)thread = q.get()thread.start()
while not q.empty():thread = q.get()thread.join(timeout=1)

输出:

Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368514377472 is working
Thread 140368497592064 is working
Thread 140368497592064 is working
Thread 140368497592064 is working

上面的代码创建了一个最大大小为 3 的 Queue 对象,这意味着在任何给定时间队列中只能有 3 个线程。 然后,使用 put() 方法创建 10 个线程并将其添加到队列中。

while循环一个一个启动队列中的线程,join() 方法用于等待所有线程完成。

在这个例子中,只有 3 个线程同时运行; 其余的将在队列中等待,直到他们有机会运行。 我们可以根据自己的需要调整队列的最大大小和线程数。

http://www.lryc.cn/news/90765.html

相关文章:

  • 创建web后端程序(servlet程序搭建)
  • 【章节1】git commit规范 + husky + lint-staged实现commit的时候格式化代码
  • 【入门】拐角III
  • 如何使用 Fail2ban 防止对 Linux 的暴力攻击?
  • 2023年,真的别裸辞....
  • 规则引擎架构-基于easy-rules
  • 【数据结构】第七周
  • 人体三维重构论文集合:awesome 3d human reconstruction
  • 揭秘Redis持久化原理,探索fork与Copy-on-Write的魔法!
  • 应届生如何提高职场竞争能力
  • ISIS 实验
  • 国产系统:麒麟之人大金仓数据库部署
  • flink1.17.0 集成kafka,并且计算
  • 【华为OD机试】数组组成的最小数字【2023 B卷|100分】
  • Exponential Loss 中的关于indicator 函数的一个恒等式
  • 【机器学习】浅析过拟合
  • 尝试在UNet的不同位置添加SE模块
  • JVM垃圾回收篇之相关概念和算法
  • (学习日记)2023.04.27
  • 亚马逊CPC广告每日该怎么调整?
  • ffmpeg下载及ffmpy3安装使用
  • 设计模式之~原型模式
  • 多传感器融合SLAM --- 8.LIO-SAM基础知识解读
  • 多模态大模型时代下的文档图像智能分析与处理
  • SAP-MM-内向外向交货单
  • Mysql - date、datetime、timestamp 的区别
  • 离散数学_十章-图 ( 4 ):图的表示和图的同构
  • MySQL锁的分类
  • 程序员如何给变量起名字
  • 隔板法(求解的组数)