协程

协程

一、gevent

pip install gevent

from gevent import monkey
import gevent
import random
import time
# 有耗时操作时需要
monkey.patch_all()  # 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块

def gevent_01(name):
    for i in range(10):
        print(name, i)
        time.sleep(random.random())

if __name__ == '__main__':
    g1 = gevent.spawn(gevent_01, "小明")
    g2 = gevent.spawn(gevent_01, "小友")
    g1.join()
    g2.join()

必须join,因为协程只是依赖在线程上的,当主线程结束,则协程直接结束。

二、全部启动并完成joinall

from gevent import monkey
import gevent
import random
import time
# 有耗时操作时需要
monkey.patch_all()  # 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块

def gevent_01(name):
    for i in range(10):
        print(name, i)
        time.sleep(random.random())

if __name__ == '__main__':
    gevent.joinall(
        [
            gevent.spawn(gevent_01,"小明"),
            gevent.spawn(gevent_01,"小友")

        ]
    )

三、进程、线程、协程

  1. 进程是操作系统资源分配的单位
  2. 线程是CPU调度的单位
  3. 进程切换需要的资源最大,效率很低
  4. 线程切换需要的资源一般,效率一般(当然在不考虑GIL的情况下)
  5. 协程切换任务资源很小,效率高
  6. 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发

四、GIL

​ 由于GIL锁的存在,所以当python脚本是I/O密集型时,线程才会有提高执行的效率,CPU密集型有可能会降低效率。

你可能感兴趣的:(Python)