使用greenlet&gevent完成多任务

协程
协程 又称微线程
协程是pthon中别外一种实现多任务的方式 只不过比线程更小占用更小执行单元(理解为需要的资源)

python中的协程大概经历了如下三下阶段:
1.最初的生成器变形yield/send
2.yield from
3.在最近的python3.5版本中引入async/await关键字

使用greenlet完成多任务
安装模块: pip install greenlet

使用gevent完成多任务
安装模块: pip install gevent

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

greenlet --协程利用程序的IO 来切换任务

from greenlet import greenlet
import time

def demo1():
    while True:
        print('demo1')
        gr2.switch()
        time.sleep(0.5)


def demo2():
    while True:
        print('demo2')
        gr1.switch()
        time.sleep(0.5)


gr1 = greenlet(demo1)
# print(greenlet.__doc__)
gr2 = greenlet(demo2)

gr1.switch()
gr2.switch()

gevent完成多任务

import gevent
import time
from gevent import monkey
# 将程序中用到的耗时操作 换为gevent 实现的模块 相当于打补丁
monkey.patch_all()

def f1(n):
    for i in range(n):
        print(gevent.getcurrent(),i)
        time.sleep(0.5)
        # gevent.sleep(0.5)

def f2(n):
    for i in range(n):
        print(gevent.getcurrent(),i)
        time.sleep(0.5)
        # gevent.sleep(0.5)

def f3(n):
    for i in range(n):
        print(gevent.getcurrent(),i)
        time.sleep(0.5)
        # gevent.sleep(0.5)

print('--1--')
g1 = gevent.spawn(f1,5)
print('--2--')
time.sleep(0.5)
# gevent.sleep(0.5)
g2 = gevent.spawn(f2,5)
print('--3--')
g3 = gevent.spawn(f3,5)
print('--4--')


g1.join()
g2.join()
g3.join()
发布了106 篇原创文章 · 获赞 0 · 访问量 2366

猜你喜欢

转载自blog.csdn.net/weixin_45905671/article/details/105393175