《人生苦短,我用python·八》多线程和线程池的使用

在Python中,多线程是一种并发编程技术,它允许多个线程在程序中并行执行。这对于IO密集型任务(如网络请求、文件读写等)非常有用,因为这些任务在等待外部资源时可以让其他线程继续工作,从而提高程序的效率。

1. 使用threading模块创建线程
Python内置的threading模块可以很方便地创建和管理线程。下面是一个简单的例子,展示如何创建和启动线程:

import threading
import timedef worker():print(f"Thread {threading.current_thread().name} is starting")time.sleep(2)print(f"Thread {threading.current_thread().name} is ending")# 创建线程
thread1 = threading.Thread(target=worker, name='Worker 1')
thread2 = threading.Thread(target=worker, name='Worker 2')# 启动线程
thread1.start()
thread2.start()# 等待线程完成
thread1.join()
thread2.join()print("All threads have finished execution")

在这个例子中,我们创建了两个线程,并启动它们。threading.current_thread().name用于获取当前线程的名称,time.sleep(2)用于模拟一个需要两秒钟完成的任务。

2. 使用Thread类创建自定义线程
你也可以通过继承threading.Thread类来创建自定义线程类:

class MyThread(threading.Thread):def __init__(self, name):super().__init__()self.name = namedef run(self):print(f"Thread {self.name} is starting")time.sleep(2)print(f"Thread {self.name} is ending")# 创建线程
thread1 = MyThread(name='Worker 1')
thread2 = MyThread(name='Worker 2')# 启动线程
thread1.start()
thread2.start()# 等待线程完成
thread1.join()
thread2.join()print("All threads have finished execution")

3. 使用线程池(concurrent.futures模块)
对于需要管理大量线程的情况,使用线程池更为方便。Python的concurrent.futures模块提供了一个高层次的接口来创建和管理线程池。

from concurrent.futures import ThreadPoolExecutor
import timedef worker(name):print(f"Thread {name} is starting")time.sleep(2)print(f"Thread {name} is ending")# 创建线程池
with ThreadPoolExecutor(max_workers=2) as executor:futures = [executor.submit(worker, f'Worker {i}') for i in range(1, 3)]# 等待所有线程完成
for future in futures:future.result()print("All threads have finished execution")

在这个例子中,我们创建了一个包含两个工作线程的线程池,并提交了两个任务给线程池执行。

4. 线程同步
在多线程编程中,同步是一个重要的概念。Python提供了多种同步原语,比如锁(Lock)、条件变量(Condition)、事件(Event)等。下面是一个使用锁的例子:

import threadinglock = threading.Lock()def worker_with_lock(name):print(f"Thread {name} is waiting for the lock")with lock:print(f"Thread {name} has acquired the lock")time.sleep(2)print(f"Thread {name} is releasing the lock")thread1 = threading.Thread(target=worker_with_lock, args=('Worker 1',))
thread2 = threading.Thread(target=worker_with_lock, args=('Worker 2',))thread1.start()
thread2.start()thread1.join()
thread2.join()print("All threads have finished execution")

在这个例子中,使用了threading.Lock来确保同一时刻只有一个线程可以访问共享资源。

5. 线程间通信
Python的queue模块提供了一个线程安全的队列,可以用来在线程之间传递数据:

import threading
import queue
import timedef producer(q):for i in range(5):print(f"Producing {i}")q.put(i)time.sleep(1)def consumer(q):while True:item = q.get()if item is None:breakprint(f"Consuming {item}")q = queue.Queue()
producer_thread = threading.Thread(target=producer, args=(q,))
consumer_thread = threading.Thread(target=consumer, args=(q,))producer_thread.start()
consumer_thread.start()producer_thread.join()
q.put(None)  # 发送停止信号
consumer_thread.join()print("All threads have finished execution")

在这个例子中,生产者线程将数据放入队列,消费者线程从队列中取数据。

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

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

相关文章

openssl交叉编译-移植ARM

OpenSSL是一个开源的密码学工具包,提供了一组用于网络安全的加密和解密算法、协议以及相关工具的库,它通过提供多种加密算法、协议和工具,为网络通信和数据存储提供了强大的安全保障。 主要功能 加密和解密: OpenSSL提供了多种对…

CDGA|数据治理:构建高质量数据要素供给体系的核心在于畅通流通渠道

随着数字化时代的到来,数据已经成为驱动经济社会发展的核心要素。数据治理作为确保数据质量、保障数据安全、促进数据价值实现的重要手段,其重要性日益凸显。在数据治理的众多环节中,构建高质量数据要素供给体系尤为关键,而该体系…

Kafka发送对象消息

在配置中添加json序列化器 spring:application:name: spring-boot-kafka-basekafka:bootstrap-servers: 192.168.225.128:9092# 配置生产者序列化producer:value-serializer: org.springframework.kafka.support.serializer.JsonSerializer# 配置默认的topictemplate:default-…

C基础day6

1、思维导图 2、 #include<myhead.h> #define MAX 10 int main(int argc, const char *argv[]) {//定义一个数组&#xff0c;用于存储班级所有成员的成绩int score[MAX] {0};//完成对成员成绩的输入for(int i0;i<MAX;i){//任意一个元素score[i]printf("请输入第…

QGC与无人机之间的通信协议MAVLink,如何实现数据的收发和处理。

QGroundControl (QGC) 和无人机之间的通信主要依赖于 MAVLink 协议。MAVLink&#xff08;Micro Air Vehicle Link&#xff09;是一个轻量级、高效的通信协议&#xff0c;广泛应用于无人机和地面控制站之间的数据传输。以下详细讲解 QGC 与无人机之间的通信协议 MAVLink&#xf…

MySQL中undo log、redo log 和 binlog三种日志的作用及应用场景

在 MySQL 数据库中&#xff0c;undo log、redo log 和 binlog 都是关键的日志类型&#xff0c;它们在数据恢复和事务管理中起着重要作用。 Undo Log&#xff08;回滚日志&#xff09; 作用&#xff1a;undo log 主要用于事务回滚和MVCC&#xff08;多版本并发控制&#xff09;。…

springboot学生成绩管理系统-计算机毕业设计源码49296

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

【Web前端】CORS概述

1、基本概念 CORS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨源资源共享&#xff09;是一种基于HTTP的安全特性&#xff0c;它允许网页从一个域请求来自不同源服务器上的指定资源。这是一种安全功能&#xff0c;用于防止恶意网站读取另一个网站的数据。同源策略…

假期笔记1:anaconda的安装与pycharm中的引用

1.下载安装 Download Anaconda Distribution | Anaconda 2.填个邮箱 11111.. 3.下载。有点需要时间 4.安装&#xff0c;双击&#xff0c;根据实际进行&#xff0c;记清安装路径 5。环境设置 conda -V 6.创建环境 conda create --name env_name conda create --na…

SpringCloud集成nacos之jasypt配置中心的密码加密的自动解密

目录 1.引入相关的依赖 2.nacos的yaml的相关配置&#xff0c;配置密码和相关算法 3.配置数据源连接 3.1 数据库连接配置 4.连接数据库配置类详解&#xff08;DataSourceConfig&#xff09;。 5.完整的配置类代码如下 1.引入相关的依赖 <dependency><groupId>…

利用JavaScript在HTML页面搜索并高亮匹配的文本

网页中内容比较多的话&#xff0c;有时候需要通过搜索快速查找特定的文本。当然&#xff0c;这可以通过浏览器的搜索功能实现&#xff0c;但是&#xff0c;象Anki的复习界面这样的场景&#xff0c;并没有搜索功能&#xff0c;我们就需要自己在网页上提供一个搜索框来实现。 下…

金蝶API取数+JSON解析,FDL助力高效数据处理

目录 一、企业介绍 二、业务难题与挑战 商管预算管理瓶颈凸显&#xff1a;金蝶数据手工导出&#xff0c;跨库关联分析时效受限 金蝶API数据提取&#xff1a;挑战重重的技术攻坚战 三、解决方案 商管预算管理升级&#xff1a;API取数JSON解析&#xff0c;FineDataLink助力高效数…

18.按键消抖模块设计(使用状态机,独热码编码)

&#xff08;1&#xff09;设计意义&#xff1a;按键消抖主要针对的时机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子就断开。因而在闭合以及断开的瞬…

centos7停服之后官方yum源无法访问和docker修改镜像源【梧桐凰】

centos停服之后&#xff0c;官方yum源无法访问&#xff0c;报Could not resolve host: mirrorlist.centos.org; Unknown error解决方案&#xff1a; 1.下载新的CentOS-Base.repo文件到/etc/yum.repos.d/目录下&#xff0c;选择 CentOS 版本&#xff1a; 2.执行如下命令&#xf…

PHP微票务微信小程序系统源码

&#x1f39f;️【一键购票&#xff0c;便捷生活新体验】微票务系统小程序全解析 &#x1f4f1;【随时随地&#xff0c;票务尽在掌握】 告别排队购票的烦恼&#xff0c;微票务系统小程序让你随时随地轻松购票&#xff01;无论是热门演唱会的门票、热门景点的入园券&#xff0…

山海鲸可视化——天地图画面和热力图

山海鲸引入天地图目前只有 iframe 的方式引入 首先我们创建一个文件夹 ——index.html ——index.js ——data.js 大家都是大佬&#xff0c;我就不详细介绍了&#xff0c;上代码都能看得懂 首先是index.html <!DOCTYPE html> <html lang"zh-CN"> <…

神领物流项目第二天

文章目录 首先登录使用获取手机号码双token验证关于校验 首先登录使用 获取openid 获取openid 是在微信登录成功之后返回的信息中 有这个openid 那么第一步就是进行登录 登录是get请求,然后使用的参数有 appid 还有秘钥 还有登录code这个是前端获取的,前端调用登录接口 然后…

实时追踪与分析用户反馈:淘宝/天猫商品评论API的应用实践

实时追踪与分析用户反馈是电商平台提升用户体验、优化产品策略的重要手段。淘宝/天猫作为国内领先的电商平台&#xff0c;其商品评论API接口为商家提供了强大的数据支持&#xff0c;帮助商家实时追踪用户反馈并进行深入分析。以下是淘宝/天猫商品评论API在实时追踪与分析用户反…

推荐一款Win11主题WPF UI框架

最近在微软商店&#xff0c;官方上架了新款Win11风格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,这款应用引入了前沿的Fluent Design UI设计&#xff0c;为用户带来全新的视觉体验。 WPF Gallery简介 做为一关注前沿资讯的开发人员&#xff0c;首先关注的是应用WPF Gallery…

cloneable接口

Cloneable 接口是 Java 标准库中的一个标记接口&#xff0c;用于指示一个类的对象能够被合法地克隆。克隆是指创建一个对象的副本&#xff0c;即一个新的对象&#xff0c;其内容与原对象相同。Cloneable 接口本身没有方法&#xff0c;它只是一个标记&#xff0c;表示实现这个接…