You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CodePattern/B 高性能模式/进程、线程、协程.md

4.2 KiB

Python中多进程、多线程、协程区别和应用场景

多任务简单地说,就是操作系统可以同时运行多个任务。分为并行和并发两种。 并行指的是任务数小于等于CPU核数即任务真的是一起执行的 并发指的是实际上一个时间只有一个任务在执行那效率是怎么提升的常常程序运行的时候需要等待IO操作比如访问数据库等待网络服务器回传数据 。这个时候并发切换到其它任务就能节省时间了。

进程是资源分配的单位 线程是操作系统调度的单位 进程切换需要的资源大 线程切换需要的资源小 协程切换任务资源很小,协程是在一个线程中所以是并发

IO密集型指的是系统的CPU性能相对硬盘、内存要好很多此时系统运作大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作此时CPU Loading并不高。这可能是因为任务本身不太需要访问I/O设备。 并行做i/o操作多线程好些。简单的异步操作用协程

进程:进程是并行。没有运行的代码叫程序,运行的程序或代码就是一个进程。进程是系统进行资源分配的最小单位,进程拥有自己的内存空间,所以进程间数据不共享。多进程适合计算密集型任务 通常我们所说的电脑配置几核就是最大可以创建的进程,注意因为电脑会切换进程,所以看起来电脑会同时运行的进程数会超过核数 数据无法内存共享。各个进程之间无影响,更稳定和安全,不因个别崩溃而整个系统崩溃。

当需要创建的子进程数量巨大时就可以用到multiprocessing模块提供的Pool方法 进程是通过Queue实现多进程之间的数据传递Queue本身是一个消息队列程序。

线程:线程是并发。 一个进程至少有一个线程,叫主线程,多个线程共享内存(数据和全局变量共享)。 多线程适合 IO 密集型操作 。 缺点就是,如果多个线程同时对同一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确 当多个线程几乎同时修改某个共享数据的时候,需要进行同步控制。 某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。 可以添加超时时间等,解决死锁

协程:用户态的轻量级线程,调度有用户控制。 协程是一种 允许在特定位置暂停或恢复的子程序。 和生成器 不同的是,协程 可以控制子程序暂停之后代码的走向,而 生成器 仅能被动地将控制权交还给调用者。 协程看上去像是线程,但是实际使用非线程的方式。 协程 可以只利用一个线程更加轻便地实现 多任务,将任务切换的开销降至最低。 和 回调 等其他异步技术相比, 协程 维持了正常的代码流程,在保证代码可读性的同时最大化地利用了 阻塞 IO 的空闲时间。它的高效与简洁赢得了开发者们的拥戴。

协程实现方式分为 以gevent第二种语法上以async和await关键字实现的协程可读性更好一些。asyncio 具体的说协程是函数体中包含yield或者yield from 的函数。一个协程可以通常处于四种状态之一('GEN_CREATED',,'GEN_RUNNING','GEN_SUSPENDED','GEN_CLOSED').

协程和线程都区别就是线程调度看系统协程你可以自己控制。yield 就可以实现了

很多时候系统瓶颈都在 IO很多涉及到 IO 特别是网络的程序都需要用到线程 /协程。 本来线程就复杂,还实现不完整,能用协程就协程 大部分用于 generator 这个特定场景 我自己的话有一个场景,每个登录用户定时拉取外部信息的需求,如果每个用户开一个线程开销太大,所以就用协程还是很方便的

模块 thread模块 是比较底层的模块 threading模块对thread做了一些包装