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做了一些包装