Python多线程加速-休眠部分线程

总所周知Python由于GIL的问题,使用多线程时同一时刻只有一个线程在工作。故Python会在所有线程之间不断的切换,每切换到一个线程会执行一段字节码指令然后切换到另一个线程。如果开启了很多线程,且只有小部分线程在工作,如果不休眠部分线程,那么每次切换到非工作线程时就会一直空转浪费资源,从而拖慢了整体效率。例如下面示例代码,总共启动了20个线程,随机分发100个计算10000阶乘的任务。

import time
import random
import threading
from queue import Queuerandom.seed(1234)
count = 0
lock = threading.Lock()def task(v: int):res = 1for i in range(1, v + 1):res = res * idef worker(input_queue: Queue):global countwhile True:if input_queue.empty():continuev = input_queue.get()task(v)with lock:count += 1if __name__ == '__main__':num_workers = 20num_tasks = 100queues = [Queue() for _ in range(num_workers)]threads = [threading.Thread(target=worker, args=(queues[i],)) for i in range(num_workers)]for thread in threads:thread.daemon = Truefor thread in threads:thread.start()time.sleep(1)t0 = time.perf_counter()for _ in range(num_tasks):idx = random.randint(0, num_workers - 1)queues[idx].put(10000)t1 = time.perf_counter()print(f"put time: {t1 - t0:.5f}")while count != num_tasks:continuet2 = time.perf_counter()print(f"total time: {t2 - t0:.5f}")

终端输出如下:

put time: 24.91427
total time: 26.17514

如果将worker中的continue换成time.sleep(0.02),再次执行终端输出如下:

put time: 0.00038
total time: 1.03202

可以看到,通过time.sleep方法让暂时没工作的线程休眠一会,将更多的工作机会提供给真正需要工作的线程,从而提升了整体效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Next.js与SSR:构建高性能服务器渲染应用

1. 创建项目 通过create-next-app脚手架创建一个新的Next.js项目: npx create-next-app my-app cd my-app2. 自动SSR 在Next.js中,每个.js或.jsx文件的组件都会被自动处理为SSR页面。例如,创建一个pages/index.js文件: // pag…

SOCKS5代理、代理IP、HTTP与网络安全

在当前网络环境中,数据安全和隐私保护是企业和个人面临的主要挑战之一。网络代理技术,如SOCKS5代理、代理IP和HTTP代理,成为了保护网络活动的关键工具。这篇文章将深入探讨这些代理技术的工作原理、它们在网络安全中的作用,以及如…

点云分割论文阅读01--FusionVision

FusionVision: A Comprehensive Approach of 3D Object Reconstruction and Segmentation from RGB-D Cameras Using YOLO and Fast Segment Anything FusionVision:使用 YOLO 和 Fast Segment Anything 从 RGB-D 相机重建和分割 3D 对象的综合方法 toread&#x…

拥有一台服务器可以做哪些有趣又实用的事情?

在接触云服务器这个概念你以前,你是不是在想: 可能是,云服务器,这个产品的存在,它可以为你做些什么实用的事情吗? 或者是,云服务器这个看似高大上的科技产品,其实可以为我们的生活…

JVM 自定义类加载器

文章目录 1. 为什么要自定义类加载器1.1 隔离加载类1.2 修改类加载的方式1.3 扩展加载源1.4 防止源码泄漏 2. 自定义类加载器应用场景有哪些3. 两种实现方式 自定义类加载器是Java中的一个高级特性,允许您在运行时动态加载类。通过自定义类加载器,您可以…

论文翻译及部分笔记:LANDMARC: Indoor Location Sensing Using Active RFID

LANDMARC: Indoor Location Sensing Using Active RFID 摘要 移动计算设备和嵌入式技术的日益融合引发了“上下文感知”应用的发展和部署,其中位置是最重要的上下文。在本文中,我们介绍了一种名为LANDMARC的定位感知原型系统,该系统使用射频识…

在云计算与人工智能中,7ECloud扮演着什么样的角色

数据驱动的时代,云计算和人工智能已成为推动现代科技进步的两大引擎。作为一家专注于云计算的公司,7ECloud正是在这个领域发挥自己的力量,力图为企业提供一站式解决方案,并拥有来自厂家的源头支持,用极其低的价格助力企…

QT day5 作业

服务器头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QList> //链表类 #include <QMessageBox> //消息对话框类 #include <QDebu…

vscode无法连接 , .vscode-server版本问题

vscode无法连接 &#xff0c; .vscode-server版本问题 解决办法 &#xff1a; 查看自己的版本号 2. 两边vscode版本号需要一致 找一台vscode可以远程连接的&#xff0c; 将它的.vscode-server/bin/b06ae3b2d2dbfe28bca3134cc6be65935cdfea6a 传到 远程服务器上 或者 本地的…

VTK 数据类型:vtkUnstructuredGrid

VTK 数据类型&#xff1a;vtkUnstructuredGrid VTK 数据类型&#xff1a;vtkUnstructuredGridVTK 中数据类型的继承关系常用的几何类型实例&#xff1a;vtkHexahedron 和 vtkTetra VTK 数据类型&#xff1a;vtkUnstructuredGrid 非结构化点是在空间中离散随意分布的点&#xf…

AI去除神器安卓手机版软件下载,一键擦除效果好Android稀缺资源

最新AI美体安卓应用&#xff0c;解锁惊喜功能&#xff01; 随着科技的不断进步&#xff0c;人工智能技术已经在各个领域展现出惊人的应用潜力。今天&#xff0c;我们将向您介绍一款最新的AI美体安卓应用&#xff0c;让您体验全新的视觉魅力&#xff01; ### 精彩功能一览 这…

绘图软件 excalidraw 部署流程 [ Ubuntu 22.4已验证 ]

文章目录 前置一、修改DNS二、添加docker 镜像三、pull excalidraw/excalidraw四、启动一个docker五、访问简介:这篇文章介绍的是一份开源的绘图软件的部署过程 前置 安装docker:Ubuntu 系统,Docker 安装步骤 [Ubuntu 22.4已验证] 其他系统请自行安装. 一、修改DNS sudo…

【数据可视化01】matplotlib实例介绍2

目录 一、引言二、实例介绍1.箱线图2.热力图3.3D图 一、引言 接着上一文章【数据可视化01】matplotlib实例介绍1继续介绍matplotlib的实例。 二、实例介绍 在matplotlib中&#xff0c;常用的图形类型包括&#xff1a; 箱线图&#xff08;Box plot&#xff09;&#xff1a;用…

算法day05

第一题 1004. 最大连续1的个数 III 题目如下所示&#xff1a; 如上题所示&#xff1a; 题目本意是在一个数组中只有1和0&#xff0c;给定一个k值&#xff0c;将小于k个0翻转成1&#xff0c;然后返回最终得到最长的1的个数&#xff1b; 我们将这到题的意思转化为另外一种意思&…

单元测试之TestNG知识点总结及代码示例

TestNG 是一个测试框架&#xff0c;用于自动化测试 Java 和 Scala 应用程序&#xff0c;它是 JUnit 和 NUnit 的一个强大替代品。TestNG 支持数据驱动测试、参数化测试、测试套件、依赖管理、多线程测试等特性。TestNG官网&#xff1a;TestNG Documentation 目录 1.TestNG 基…

100条常见的c语言bug汇总上篇3

21. 忽视错误处理 在编写C语言程序时&#xff0c;错误处理是一个重要的方面。忽视错误处理可能导致程序在遇到问题时无法正确响应&#xff0c;甚至可能导致更严重的后果。 代码案例&#xff1a; #include <stdio.h> #include <stdlib.h> int main() {FILE *file …

PCB笔记(二十六):PCB检查

前言 首先检查元器件是否100&#xff05; 放置 文章目录 1、打开DRC2、database check3、检查DRC4、检查多余的线5、其他需要注意的点a.检查差分线、等长线是否已调好b.注意检查晶振、电感等元件上/下方是否其他线经过&#xff08;一般不允许线经过&#xff09;c.打开place_bo…

【管理咨询宝藏101】普华永道并购尽调内部培训

【管理咨询宝藏101】普华永道并购尽调内部培训 【格式】PDF版本 【关键词】普华永道、兼并收购、尽职调查 【核心观点】 - 尽职调查的目的&#xff0c;发现潜在的致命缺陷&#xff0c;判断是否继续交易进程&#xff1b;发现潜在的问题&#xff0c;制定交易前后相应的应对措施。…

vue阶段性测试题,内容丰富,案例典型,题目配有答案

阶段性测试 理论题实践题 1&#xff09;理论题 请简述Vue、Node.js、Vscode是什么&#xff0c;以及有什么关系 1. vue是一个轻量级、比较灵活的且支持组件开发的网络框架 2. node.js是让JavaScript运行在服务器上的一直环境 3. Vscode是一款有着丰富插件的代码编辑器 4. 关系…

Hive的group by

-- 创建 stu 表 CREATE TABLE stu( id int, name string, age int, sex string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t;-- 表内数据 load data local inpath /home/hadoop/stu into table stu; 1 name1 12 boy 2 name2 12 boy 3 name3 13 girl 4 n…