Python入门(13)--并发编程

Python并发编程:从入门到实践 🚀

1. 多线程编程基础 🧵

多线程是实现并发的重要方式,Python提供了threading模块来支持多线程编程。

1.1 基本线程操作

import threading
import time
from typing import List, Callableclass ThreadManager:"""线程管理器:用于创建和管理线程"""def __init__(self):self.threads: List[threading.Thread] = []def create_thread(self, target: Callable, args: tuple = ()) -> threading.Thread:"""创建新线程:param target: 线程执行的目标函数:param args: 传递给目标函数的参数:return: 创建的线程对象"""thread = threading.Thread(target=target, args=args)self.threads.append(thread)return threaddef start_all(self) -> None:"""启动所有线程"""for thread in self.threads:thread.start()def join_all(self) -> None:"""等待所有线程完成"""for thread in self.threads:thread.join()def thread_demo():def worker(name: str, sleep_time: int) -> None:"""线程工作函数"""print(f"线程 {name} 开始工作")time.sleep(sleep_time)print(f"线程 {name} 完成工作")# 创建线程管理器manager = ThreadManager()# 创建多个线程for i in range(3):manager.create_thread(target=worker, args=(f"Thread-{i}", i))# 启动并等待完成manager.start_all()manager.join_all()

1.2 线程同步机制

from threading import Lock, RLock, Condition, Event, Semaphore
from typing import Anyclass ThreadSafe:"""线程安全的资源访问演示"""def __init__(self):self._lock = Lock()self._rlock = RLock()self._condition = Condition()self._event = Event()self._semaphore = Semaphore(2)self._resource = 0def lock_example(self) -> None:"""使用Lock进行互斥访问"""with self._lock:self._resource += 1print(f"资源值: {self._resource}")def rlock_example(self) -> None:"""使用RLock进行可重入锁定"""with self._rlock:with self._rlock:  # 可以重复获取锁self._resource += 1def condition_example(self) -> None:"""使用Condition进行条件同步"""with self._condition:# 等待条件满足self._condition.wait_for(lambda: self._resource > 5)print("条件满足,继续执行")def event_example(self) -> None:"""使用Event进行事件同步"""self._event.wait()  # 等待事件print("事件被触发")def semaphore_example(self) -> None:"""使用Semaphore限制并发访问"""with self._semaphore:print("获得信号量")time.sleep(1)print("释放信号量")## 2. 多进程编程 🔄多进程适合CPU密集型任务,Python的`multiprocessing`模块提供了强大的多进程支持。```python
from multiprocessing import Process, Pool, Queue, Manager
import osclass ProcessManager:"""进程管理器:用于创建和管理进程"""@staticmethoddef process_worker(name: str) -> None:"""进程工作函数:param name: 进程名称"""print(f"进程 {name} (PID: {os.getpid()}) 开始工作")time.sleep(2)print(f"进程 {name} 完成工作")@staticmethoddef pool_example() -> None:"""进程池示例"""with Pool(processes=4) as pool:# 使用进程池并行处理任务results = pool.map(lambda x: x * x, range(10))print(f"进程池计算结果: {results}")@staticmethoddef queue_example() -> None:"""进程间通信示例"""def producer(queue: Queue) -> None:"""生产者进程"""for i in range(5):queue.put(f"item-{i}")time.sleep(1)def consumer(queue: Queue) -> None:"""消费者进程"""while True:item = queue.get()print(f"消费: {item}")# 创建队列和进程q = Queue()p1 = Process(target=producer, args=(q,))p2 = Process(target=consumer, args=(q,))# 启动进程p1.start()p2.start()# 等待生产者完成p1.join()## 3. 异步IO编程 🌊Python的`asyncio`模块提供了异步编程的支持,特别适合IO密集型任务。```python
import asyncio
from typing import List
import aiohttpclass AsyncIOManager:"""异步IO管理器"""@staticmethodasync def async_task(name: str) -> str:"""异步任务示例:param name: 任务名称:return: 任务结果"""print(f"任务 {name} 开始")await asyncio.sleep(1)  # 模拟IO操作print(f"任务 {name} 完成")return f"Result-{name}"async def run_tasks(self) -> List[str]:"""运行多个异步任务:return: 任务结果列表"""tasks = [self.async_task(f"Task-{i}")for i in range(3)]results = await asyncio.gather(*tasks)return results## 4. 实战案例:并发下载器 🚀结合上述所有概念,实现一个高效的并发下载器。```python
import asyncio
import aiohttp
import os
from typing import List, Dict
from dataclasses import dataclass
from concurrent.futures import ThreadPoolExecutor
import threading@dataclass
class DownloadTask:"""下载任务数据类"""url: strfilename: strsize: int = 0downloaded: int = 0status: str = 'pending'class ConcurrentDownloader:"""并发下载器支持多线程、多进程和异步IO"""def __init__(self, save_dir: str = './downloads'):self.save_dir = save_dirself.tasks: Dict[str, DownloadTask] = {}self.lock = threading.Lock()os.makedirs(save_dir, exist_ok=True)async def async_download(self, url: str, filename: str) -> None:"""异步下载单个文件:param url: 下载URL:param filename: 保存的文件名"""task = DownloadTask(url=url, filename=filename)self.tasks[url] = tasktry:async with aiohttp.ClientSession() as session:async with session.get(url) as response:if response.status == 200:task.size = int(response.headers.get('content-length', 0))filepath = os.path.join(self.save_dir, filename)with open(filepath, 'wb') as f:while True:chunk = await response.content.read(8192)if not chunk:breakf.write(chunk)task.downloaded += len(chunk)task.status = 'completed'else:task.status = 'failed'except Exception as e:print(f"下载错误 {url}: {str(e)}")task.status = 'failed'async def batch_download(self, urls: List[Dict[str, str]]) -> None:"""批量下载文件:param urls: URL和文件名的字典列表"""tasks = [self.async_download(item['url'], item['filename'])for item in urls]await asyncio.gather(*tasks)def get_progress(self) -> Dict[str, Dict]:"""获取下载进度:return: 所有任务的进度信息"""with self.lock:return {url: {'filename': task.filename,'size': task.size,'downloaded': task.downloaded,'status': task.status,'progress': (task.downloaded / task.size * 100) if task.size > 0 else 0}for url, task in self.tasks.items()}# 使用示例
async def download_demo():"""下载器示例"""downloader = ConcurrentDownloader()# 准备下载任务urls = [{'url': 'http://example.com/file1.zip', 'filename': 'file1.zip'},{'url': 'http://example.com/file2.pdf', 'filename': 'file2.pdf'},]# 开始下载await downloader.batch_download(urls)# 获取进度progress = downloader.get_progress()print("下载进度:", progress)if __name__ == "__main__":# 运行异步下载示例asyncio.run(download_demo())

5. 最佳实践与注意事项 ⚠️

  1. 线程使用建议:

    • GIL限制了Python多线程在CPU密集型任务上的表现
    • 适合IO密集型任务
    • 注意线程安全和死锁问题
  2. 进程使用建议:

    • 适合CPU密集型任务
    • 注意进程间通信的开销
    • 合理使用进程池
  3. 异步IO使用建议:

    • 适合大量IO操作场景
    • 避免在协程中使用阻塞操作
    • 使用异步库而不是同步库
  4. 性能优化:

    • 根据任务特点选择合适的并发方式
    • 避免过度并发
    • 合理设置超时和重试机制

6. 拓展学习方向 🎯

  1. 深入研究Python的GIL机制
  2. 探索分布式计算框架
  3. 学习反应式编程
  4. 研究并发设计模式
  5. 了解更多异步框架(如Trio)

通过本文的学习,你已经掌握了Python并发编程的核心概念和实践技巧。继续探索和实践,你将能够构建更高效的并发应用!🐍✨


如果你觉得这篇文章有帮助,欢迎点赞转发,也期待在评论区看到你的想法和建议!👇

咱们下一期见!

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

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

相关文章

SMMU软件指南操作之翻译过程概述

安全之安全(security)博客目录导读 下图展示了每个传入事务(transaction)所经过的简化过程。本节描述了顶层翻译过程。 一个传入事务遵循以下步骤: 1. 如果 SMMU 被全局禁用,事务将直接通过 SMMU 而不进行任何地址改变。全局属性…

特征交叉-MaskNet文章总结代码实现

MaskNet 这个模型是微博21年提出的,23年twitter(X)开源的推荐系统排序模块使用的backbone结构。 核心思想是认为DNN为主的特征交叉是addictive,交叉效率不高;所以设计了一种multiplicatvie的特征交叉 如何设计muliplicative特征交叉呢&#x…

QT 实现仿制 网络调试器(未实现连接唯一性) QT5.12.3环境 C++实现

网络调试助手&#xff1a; 提前准备&#xff1a;在编写代码前&#xff0c;要在.pro工程文件中&#xff0c;添加network模块。 服务端&#xff1a; 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QtWidgets> #inclu…

Vscode写markdown快速插入python代码

如图当我按下快捷键CRTLSHIFTK 自动出现python代码片段 配置方法shortcuts’ 打开这个json文件 输入 {"key": "ctrlshiftk","command": "editor.action.insertSnippet","when": "editorTextFocus","args&…

【案例】泛微.齐业成助力北京中远大昌汽车实现数电票全流程管理

中远大昌统一发票共享平台上线三个多月以来&#xff0c;实现&#xff1a; 5000份 60000元 发票开具 成本节约 客户简介及需求分析 北京中远大昌汽车服务有限公司&#xff08;以下简称“中远大昌”&#xff09;成立于2002年&#xff0c;是中远海运集团所属香远&#xff08;北…

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像

文章目录 应用快速部署NginxRedisMySQLTomcat 制作镜像镜像原理基于已有容器创建使用 Dockerfile 创建镜像指令说明构建应用创建 Dockerfile 文件创建镜像 应用快速部署 Nginx docker run -d -p 80:80 nginx使用浏览器访问虚拟机地址 Redis docker pull redis docker run --…

雅思阅读TFNG题型7大解题思路

雅思阅读TFNG题型7大解题思路&#xff0c;全在这了‼️ ⚠️在徘徊在6-6.5的同学有很大的共性就是对题型不够熟悉&#xff0c;我记得我当时卡6.5的时候我有时候分不清NG和F&#xff0c;有时候又分不清NG 和True&#xff0c;也不知道他有哪几种考我的方法&#xff0c;脑子里没有…

家政服务系统开发,智慧家政,便捷生活

近年来&#xff0c;大众对家政服务的需求不断增加&#xff0c;家政服务种类也逐渐多样化&#xff0c;涵盖了日常生活中的各个方面&#xff0c;为大众带来更急优质的服务&#xff0c;进一步提升了家政市场的发展。 在数字化发展的推动下&#xff0c;互联网家政服务的模式应运而…

重生之我在学环境变量

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但 是照样可以链接成功&#…

Failed to start Docker Application Container Engine

说明&#xff1a; 1&#xff09;访问应用业务&#xff0c;读取不到数据&#xff0c;show databases;查看数据库报错 2&#xff09;重启docker服务&#xff0c;服务启动失败&#xff0c;查看日志报错如下图所示 3&#xff09;报错信息&#xff1a;chmod /data/docker: read-only…

SQL 语句执行计划中的连接方式

SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类&#xff1a;外连接&#xff08;细分为&#xff1a;左连接&#xff08;Left outer join/ left join&#xff09;、右连接&#xff08;right outer join/ right join&#xff09;、全连接&#xff08;full outer …

FileProvider高版本使用,跨进程传输文件

高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。 首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明: <provideran…

golang 嵌入式armv7l压缩编译打包

编译 Go 应用程序 go build -ldflags"-s -w" -o myapp.exe . 使用 UPX 压缩可执行文件&#xff08;window下载并设置环境变量&#xff09; upx --best --lzma myapp.exe 可从10M压缩到1M 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 …

45.坑王驾到第九期:Mac安装typescript后tsc命令无效的问题

点赞收藏加关注&#xff0c;你也能主打别墅&#xff01; 一、问题描述 Mac上终端运行如下命令&#xff1a; sudo npm install typescript -g //全局安装ts提示成功安装后&#xff0c;我测试tsc -v这个命令时出现如下错误&#xff1a; 也就是说找不到 tsc 命令。 二、解决方…

【图像检测】深度学习与传统算法的区别(识别逻辑、学习能力、泛化能力)

识别逻辑 深度学习 使用了端到端的学习策略&#xff0c;直接学习从图像到检测结果的映射关系&#xff0c;自动提取特征&#xff0c;并且根据特征与特征之间的关系&#xff0c;计算出检测结果。 传统算法 则是人工提取特征&#xff0c;比如边缘特征&#xff0c;直线特征&#x…

sysbench压测DM的高可用切换测试

一、配置集群 1. 配置svc.conf [rootlocalhost dm]# cat /etc/dm_svc.conf TIME_ZONE(480) LANGUAGE(CN)DM(192.168.112.139:5236,192.168.112.140:5236) [DM] LOGIN_MODE(1) SWITCH_TIME(300) SWITCH_INTERVAL(200)二、编译sysbench 2.1 配置环境变量 [dmdba~]# vi ~/.bas…

【网络】网络抓包与协议分析

网络抓包与协议分析 一. 以太网帧格式分析 这是以太网数据帧的基本格式&#xff0c;包含目的地址(6 Byte)、源地址(6 Byte)、类型(2 Byte)、数据(46~1500 Byte)、FCS(4 Byte)。 Mac 地址类型 分为单播地址、组播地址、广播地址。 单播地址&#xff1a;是指第一个字节的最低位…

安宝特方案 | AR助力紧急救援,科技守卫生命每一刻!

在生死时速的紧急救援战场上&#xff0c;每一秒都至关重要&#xff01;随着科技的发展&#xff0c;增强现实&#xff08;AR&#xff09;技术正在逐步渗透到医疗健康领域&#xff0c;改变着传统的医疗服务模式。 安宝特AR远程协助解决方案&#xff0c;凭借其先进的技术支持和创新…

2025职业院校技能大赛信息安全管理与评估(河北省) 任务书

2025职业院校技能大赛信息安全管理与评估--河北省 任务书 模块一网络平台搭建与设备安全防护任务1&#xff1a;网络平台搭建 &#xff08;50分&#xff09;任务2&#xff1a;网络安全设备配置与防护&#xff08;250分&#xff09; 模块二网络安全事件响应、数字取证调查、应用程…

vscode 远程连接ssh 密钥方式

目录 1. powershell 生成key&#xff1a; 2. 在服务器上安装公钥 3).为了确保连接成功&#xff0c;输入如下指令以保证以下文件权限正确&#xff1a; 3 开启 ssh 密钥登录 vscode 远程连接配置 python连接 python实现 1. powershell 生成key&#xff1a; 在命令行执行s…