python基础入门:7.3并发编程初探

Python并发编程全面解析:解锁程序性能的新维度

# 并发执行模板
import concurrent.futures
import timedef task(n):"""模拟耗时任务"""print(f"开始执行任务 {n}")time.sleep(2 if n % 2 == 0 else 1)return f"任务 {n} 完成"# 多线程执行
with concurrent.futures.ThreadPoolExecutor() as executor:results = [executor.submit(task, i) for i in range(5)]for f in concurrent.futures.as_completed(results):print(f.result())# 多进程执行
with concurrent.futures.ProcessPoolExecutor() as executor:results = executor.map(task, range(5))for res in results:print(res)
一、多线程编程实战
  1. 线程池基础用法
import threading
from queue import Queuedef worker(q):"""线程工作函数"""while True:item = q.get()if item is None:breakprint(f"处理 {item}")q.task_done()# 创建线程池
q = Queue()
threads = []
for i in range(3):t = threading.Thread(target=worker, args=(q,))t.start()threads.append(t)# 提交任务
for item in ['A', 'B', 'C', 'D', 'E']:q.put(item)# 等待完成
q.join()
for _ in range(3):q.put(None)
for t in threads:t.join()
  1. 线程安全与锁机制
class BankAccount:def __init__(self):self.balance = 1000self.lock = threading.Lock()def transfer(self, amount):with self.lock:new_balance = self.balance + amounttime.sleep(0.1)  # 模拟处理延迟self.balance = new_balancedef test_transfer(account):for _ in range(100):account.transfer(1)account = BankAccount()
threads = []for _ in range(10):t = threading.Thread(target=test_transfer, args=(account,))threads.append(t)t.start()for t in threads:t.join()print(f"最终余额: {account.balance}")  # 正确应为2000
二、多进程编程深入
  1. 进程间通信(IPC)
from multiprocessing import Process, Pipedef worker(conn):"""子进程处理函数"""while True:msg = conn.recv()if msg == 'exit':breakprint(f"处理消息: {msg}")conn.send(msg.upper())conn.close()# 创建管道
parent_conn, child_conn = Pipe()# 启动子进程
p = Process(target=worker, args=(child_conn,))
p.start()# 主进程通信
messages = ['hello', 'world', 'python', 'exit']
for msg in messages:parent_conn.send(msg)if msg != 'exit':print(f"收到回复: {parent_conn.recv()}")p.join()
  1. 共享内存与性能对比
import multiprocessingdef cpu_bound(n):"""计算密集型任务"""return sum(i*i for i in range(n))# 顺序执行
start = time.time()
[cpu_bound(10**6) for _ in range(4)]
print(f"顺序执行: {time.time()-start:.2f}s")# 多进程执行
start = time.time()
with multiprocessing.Pool() as pool:pool.map(cpu_bound, [10**6]*4)
print(f"多进程执行: {time.time()-start:.2f}s")
三、协程与异步编程
  1. asyncio基础架构
import asyncioasync def fetch_data(url):"""模拟异步请求"""print(f"开始请求 {url}")await asyncio.sleep(2)  # 模拟IO等待print(f"完成请求 {url}")return f"{url} 响应"async def main():tasks = [asyncio.create_task(fetch_data(f"https://api/data/{i}"))for i in range(5)]results = await asyncio.gather(*tasks)print("所有请求完成:", results)# 执行事件循环
asyncio.run(main())
  1. 生产级异步HTTP客户端
import aiohttp
import async_timeoutasync def async_fetch(session, url):"""带超时的异步请求"""try:async with async_timeout.timeout(5):async with session.get(url) as response:return await response.text()except asyncio.TimeoutError:print(f"请求超时: {url}")return Noneasync def batch_fetch(urls):"""批量异步请求"""async with aiohttp.ClientSession() as session:tasks = [async_fetch(session, url) for url in urls]return await asyncio.gather(*tasks)# 使用示例
urls = ['https://httpbin.org/delay/1','https://httpbin.org/delay/3','https://httpbin.org/delay/2'
]results = asyncio.run(batch_fetch(urls))
print("获取到", len([r for r in results if r]), "个有效响应")
四、并发模型对比与选择
  1. 并发方式对比矩阵
特性多线程多进程协程
执行模型抢占式切换独立内存空间协作式切换
最佳适用场景I/O密集型任务CPU密集型任务高并发I/O操作
内存占用共享内存,较低独立内存,较高极低
启动开销较小较大最小
数据共享通过共享内存需要IPC机制通过事件循环
Python实现限制受GIL限制无GIL限制需要Python 3.7+
  1. 性能测试对比(处理1000个HTTP请求)
方式耗时CPU使用率内存占用
同步顺序执行82.3s12%45MB
多线程(50线程)4.2s85%210MB
多进程(4进程)6.8s95%580MB
协程(500并发)2.1s78%65MB
混合型
问题类型
CPU密集型?
多进程
I/O密集型?
高并发?
协程
多线程
进程+线程/协程

最佳实践指南

  1. 优先使用concurrent.futures高层API
  2. 避免在多线程中执行CPU密集型任务
  3. 使用队列进行线程/进程间通信
  4. 协程中避免阻塞操作
  5. 设置合理的并发数量(线程/进程数)
  6. 使用threading.local管理线程局部存储
  7. 多进程编程时使用Manager共享状态
  8. 异步编程注意异常处理
  9. 使用性能分析工具(cProfile, line_profiler)
  10. 考虑使用第三方库(celery, ray)
# 生产环境配置示例
MAX_WORKERS = min(32, (os.cpu_count() or 1) + 4)  # 线程池公式def safe_execute(func):"""带异常处理的执行装饰器"""@functools.wraps(func)def wrapper(*args, **kwargs):try:return func(*args, **kwargs)except Exception as e:logging.error(f"执行失败: {str(e)}")raisereturn wrapper@safe_execute
def critical_task():"""关键任务函数"""# 业务逻辑...

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

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

相关文章

2.11寒假作业

web:[SWPUCTF 2022 新生赛]js_sign 打开环境是这样的,随便输入进行看看 提示错误,看源码其中的js代码 这个代码很容易理解,要让输入的内容等于对应的字符串,显然直接复制粘贴是错的 这串字符看起来像是base64加密&…

c# http

C#代码 客户端: NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如…

哈希表实现(C++实现)

目录 1.哈希概念 2.哈希冲突 3.哈希函数 4.哈希冲突解决 闭散列 —— 开放定址法 线性探测 二次探测 开散列 —— 链地址法(拉链法、哈希桶) 5.哈希表的闭散列实现 哈希表的结构 哈希表的大小和扩容 哈希表的插入 哈希表的查找 哈希表的删除…

开箱即用:一个易用的开源表单工具!

随着互联网的普及,表单应用场景越来越广泛,从网站注册、调查问卷到考试测评,无处不在。传统的表单制作方式需要一定的代码基础,对于不懂编程的小伙伴来说,无疑是一道门槛。 今天,给大家分享一款开源的表单…

牛客 BM1: 反转链表

目录 一、题目 二、C解题程序框架 1. 结构体定义 2. 类定义 3. 输入输出说明 三、链表指针 1. 链表指针的基本概念 2. 链表指针的常见操作 1. 遍历链表 2. 插入节点 3. 删除节点 3. 链表指针操作的注意事项 4. 总结 四、解题 方法一:迭代法 方法二&…

MIT开源7B推理模型Satori:用行动思维链进行强化学习,增强自回归搜索

自OpenAI的o1发布以来,研究社区为提升开源LLM的高级推理能力做出了诸多努力,包括使用强大的教师模型进行蒸馏、蒙特卡洛树搜索(MCTS)以及基于奖励模型的引导搜索等方法。 本研究旨在探索一个新的研究方向:使LLM具备自回…

Kubernetes控制平面组件:etcd(一)

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)kubectl 和 …

Django在终端创建项目(pycharm Windows)

1.选择目录 选择或新建一个文件夹,作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时,django-admin.exe安装的位置,例如 4.运行命令 使用django-admin.exe的绝对路径,在刚才打开的终端…

e2studio开发RA2E1(9)----定时器GPT配置输入捕获

e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback…

【PS 2022】Adobe Genuine Service Alert 弹出

电脑总是弹出Adobe Genuine Service Alert弹窗 1. 不关掉弹窗并打开任务管理器,找到Adobe Genuine Service Alert,并右键进入文件所在位置 2 在任务管理器中结束进程并将文件夹中的 .exe 文件都使用空文档替换掉 3. 打开PS不弹出弹窗,解决&a…

RoboGrasp:一种用于稳健机器人控制的通用抓取策略

25年1月来自北京大学和哈佛大学的论文“RoboGrasp: A Universal Grasping Policy for Robust Robotic Control”。 模仿学习和世界模型在推进通用机器人学习方面显示出巨大的潜力,而机器人抓取仍然是实现精确操控的关键挑战。现有方法通常严重依赖机械臂状态数据和…

接口测试Day12-持续集成、git简介和安装、Gitee远程仓库、jenkins集成

持续集成 概念: 团队成员将自己的工作成果,持续集成到一个公共平台的过程。成员可以每天集成一次,也可以一天集成多 次。 相关工具: 本地代码管理:git远程代码管理:gitee(国内)、github(国外)、gitlib(公司…

C语言基础11:分支结构以及if的使用

C语言基础 内容提要 分支结构 条件判断用if语句实现分支结构 分支结构 问题抛出 我们在程序设计往往会遇到如下问题,比如下面的函数的计算: y { 1 / x 当 x ≠ 0 时 10000 当 x 0 时 y \begin{cases} 1/x \quad当x\neq0时\\ \\ 10000 \quad当x0…

81页精品PPT | 华为流程与信息化实践与架构规划分享

华为流程与信息化实践与架构规划分享主要围绕华为在业务流程与信息化建设方面的经验、企业架构规划方法以及企业数字化转型路径展开。华为通过持续的业务变革和信息化建设,从本土企业逐步发展为国际化、全球化企业,其管理体系以持续创新和世界级管理体系…

【最大开支——优先队列,计算增量】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; using pll pair<ll, int>; #define x first #define y second const int N 1e5 10; int n, m; int k[N], b[N], cnt[N]; priority_queue<pll, vector<pll>> pq; // d…

174款复古Y2K酸性镀铬银色金属多样化锁链链条铁链几何抽象PNG免扣元素设计套装 Studio 2AM - Chains

Chains 是以链条纹理为主题的设计元素的集合。以 PNG 格式以高分辨率创建&#xff0c;但文件大小较小&#xff0c;因此不会占用硬盘空间。“Chains” 是以 PNG 格式提供的以链条为主题的设计元素的高分辨率集合。该套装包括 174 个银色、生锈和彩虹色材料的链条纹理&#xff0c…

将 AMD Zynq™ RFSoC 扩展到毫米波领域

目录 将 AMD Zynq™ RFSoC 扩展到毫米波领域Avnet XRF RFSoC 系统级模块适用于 MATLAB 的 Avnet RFSoC Explorer 工具箱5G mmWave PAAM 开发平台突破性的宽带毫米波波束成形特征&#xff1a;OTBF103 Mathworks Simulink 模型优化毫米波应用中的射频信号路径 用于宽带毫米波上/下…

IDEA中打包maven项目,提示Compilation failure

使用IDEA打包maven项目&#xff0c;报错如下&#xff1a; 解决方法&#xff1a;在pom文件中指定JDK版本即可 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target> </propertie…

Idea集成deepseek生成代码

今天我带大家在idea上安装CodeGpt插件&#xff0c;这个插件可以根据我们的提示词生产代码&#xff0c;我们一起试试。 1、安装插件 打开idea&#xff0c;再点击setting菜单&#xff0c;按以下步骤操作。 安装完成后&#xff0c;一定要点击第四步“ok”。再次点击菜单setting…

C++STL(六)——list模拟

目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…