python并发编程
2024-01-01 19:37:16
CPU密集型(CPU-Bound)
- cpu密集型也叫计算密集型,是指I/O在很短的时间内就可以完成,cpu需要大量的计算和处理,特点是cpu占用率相当高
- 例如:压缩解压缩、加密解密、正则表达式搜索
IO密集型(I/O-bound)
- IO密集型指的是系统运作大部分的状况是CPU在等I/O(硬盘/内存)的读/写操作,CPU占用率仍然很低。
- 例如:文件处理程序、网络爬虫程序、读写数据库程序
- 如果你的程序依赖大量的外部数据源,比如内存磁盘和网络
,就是io密集型。
一个进程中可以启动多个线程
一个线程中可以启动多个协程
多进程Process(multiprocessing)
- 优点:可以利用多核CPU并行运算
- 缺点:占用资源最多、可启动熟读比线程少
- 适用于:CPU密集型运算
多线程Thread(threading)
-
优点:相比进程,更轻量级、占用资源少
-
每一个线程的运行都要包含自己的一些变量的存储,存储到内存区域,这是线程本身要消耗内存的
-
缺点:
- 相比进程:多线程只能并发执行,不能利用CPU(GIL)。
- 相比协程:启动数目有限制,占用内存资源,有线程切换开销。
-
适用于:IO密集型计算、同时运行的任务数目要求不多
多协程Coroutine(asyncio)
- 优点:内存开销最少、启动协程数量最多
- 缺点:支持的库有限(aihttp VS requests)、代码实现复杂
- 适用于:IO密集型计算、需要超多任务运行、但有现成库支持的场景
全局解释性锁(GIL)
python速度慢的原因
-
动态类型语言,边解释边执行(源码–>机器码),c++是预先对源码进行编译成机器码,然后运行,因此执行速度快。python中的变量,需要随时检查变量类型。
-
GIL。无法利用多核CPU并发执行。
- Global Interpreter Lock是计算机程序设计解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。即便在多核心处理器上,使用GIL的解释器也只允许同一时间执行同一个线程。
-
多线程threading机制依然是有用的,用于IO密集型运算,因为在I/O(read、write、send、recv、etc.)期间,线程会释放GIL,实现CPU和IO的并行,因此多线程用于IO密集型运算依然可以大幅度提升速度。
-
但是多线程用于CPU密集型计算时,只会更加拖慢速度。
-
使用multiprocessing的多进程机制实现并行计算、利用多核CPU的优势,为了应对GIL的问题,python提供了multiprocessing
python多线程爬虫
python线程安全概念
-
线程安全指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。由于线程的执行随时会发生切换,就造成了不可预料的结果,出现线程不安全。
-
Lock用于解决线程安全问题
- try-finally模式
import threading
lock = threading.lock()
lock.acquire()
try:
#do something
finally:
lock.release()
- with模式
import threading
lock = threading.lock()
with lock:
#do something
线程池
- 新建线程系统需要分配资源、终止线程系统需要回收资源,如果可以重用线程,则可以减去新建/终止的开销
- 优点:
- 提升性能:因为减去了大量新建、终止线程的开销,重用了线程资源
- 适用场景:适合处理突发性大量请求或需要大量线程完成任务、但实际任务处理时间较短。
- 防御功能:能有效避免系统因为创建线程过多,而导致系统负荷过大相应变慢等问题。
- 代码优势:使用线程池的语法比自己新建线程执行线程更加简洁。
- map模式
- submit模式
web服务的架构及特点
- web后台服务的特点:
- web服务对响应时间要求非常高,比如要求200ms返回。
- web服务有大量的依赖IO操作的调用,比如磁盘文件、数据库、远程API。
- web服务经常需要处理几万人、几百万人的同时请求。
- 使用线程池的好处
- 方便的将磁盘文件、数据库、远程API的IO调用并发执行
- 线程池的线程数目不会无限创建(导致系统挂掉),具有防御功能
python异步IO并发编程
- 协程:单线程内实现并发
- python异步IO库:asyncio
文章来源:https://blog.csdn.net/qq_44091004/article/details/128070440
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!