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

参考哔哩哔哩up:蚂蚁学python

文章来源:https://blog.csdn.net/qq_44091004/article/details/128070440
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。