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

python 中线程、进程、协程

1.线程和线程池

 t1 =  threading.Thread(target = task, args=("a"))t2 =  threading.Thread(target = task, args=("b"))with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:executor.map(task, ["A,B,C,D"])
threads = [threading.Thread(target = increment()) for _ in range(4)]for t in threads:t.start()for t in threads:t.join()
count = 0
lock = threading.Lock()
def increment():global countfor i in range(100):with lock:count +=1

2.进程和进程池

def send(conn):conn.send("helloworld")
def receive(conn):print(conn.recv())val =  multiprocessing.Value("i",1) // 共享变量queue = multiprocessing.Queue()process = multiprocessing.Process(target = worker,args= (queue,))process2 = multiprocessing.Process(target = worker, args=(queue,))process.start()process2.start()process.join()process2.join()with concurrent.futures.ProcessPoolExecutor(5) as executor:executor.map(worker,["a","b","c","d"])processes = [multiprocessing.Process(target = printVal, args =(val,))for _ in range(4)]for process in processes:process.start()for process in processes:process.join()

asyncio  

async def cpu_bound_task(n):total = 0for i in range(10**8):total += i*nprint(f"total is {total}")await asyncio.sleep(10)return total
def event_loop(n):asyncio.run(cpu_bound_task(n))
async def main():loop = asyncio.get_event_loop()with ProcessPoolExecutor() as pool:result = await loop.run_in_executor(pool,cpu_bound_task, 10)print(f"result is {result}")
for i in range(4):p = multiprocessing.Process(target= event_loop, args=(10,))pList.append(p)p.start()for p in pList:p.join()
asyncio.run(main())
print("主线程执行结束")

五、总结

方案适用场景主要特性
多线程(threading)I/O 密集型(爬虫、文件 I/O)共享内存,受 GIL 限制
线程池(ThreadPoolExecutor)并发 I/O 任务自动管理线程
多进程(multiprocessing)CPU 密集型任务多核计算,不受 GIL 限制
进程池(ProcessPoolExecutor)大规模计算任务自动管理进程
协程(asyncio)I/O 高并发(API、爬虫)非阻塞执行
如何选择?
  1. CPU 密集型任务(科学计算、数据分析) → 多进程
  2. I/O 密集型任务(爬虫、数据库查询) → 多线程 或 asyncio
  3. 高并发任务(网络请求、日志处理) → asyncio
http://www.xdnf.cn/news/13426.html

相关文章:

  • RED:用于低剂量 PET 正弦图重建的残差估计扩散模型|文献速递-深度学习医疗AI最新文献
  • 上门服务类App开发全流程:从需求分析到部署上线
  • 【16】牵绳遛狗数据集(有v5/v8模型)/YOLO牵绳遛狗检测
  • 前馈神经网络
  • Vim 撤销 / 重做 / 操作历史命令汇总
  • 【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
  • 【大模型】解耦大语言模型中的记忆与推理能力
  • 【大模型RAG】识别-检索-生成:拍照搜题给出答案原理讲解
  • IP地址可视化:从现网监控到合规检测、准入控制全面管理
  • 【单片机期末】接口及应用
  • 算法第12天|继续学习二叉树:翻转二叉树、对称二叉树、二叉树最大深度、二叉树的最小深度
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第十六讲)
  • DnSpy调试基础
  • gRPC、WebSocket 与 HTTP 的核心区别对比
  • 将两个变量a,b的值进行交换,不使用任何中间变量
  • Cursor 工具项目构建指南:让 AI 审查 AI 生产的内容,确保生产的内容质量和提前发现问题
  • Vim 翻页与滚动命令总览
  • 新能源知识库(35)AutoML在用电负荷预测中如何应用?
  • 【杂谈】-递归进化:人工智能的自我改进与监管挑战
  • Linux基础指令大全
  • SpringCloud微服务入门
  • Day50 Python打卡训练营
  • Vim 修改(change)命令完整学习笔记
  • [原创]X86C++反汇编02.算术指令
  • 闪回还能导致OGG同步失败
  • 生成xcframework
  • 一个获取极简风格动画素材的网站
  • Day11_刷题niuke20250610
  • CppCon 2015 学习:C++ Requests
  • Vim 插件管理:MiniBufExplorer 使用指南