协程

作者: 米兰的小铁匠 | 来源:发表于2018-05-22 11:39 被阅读40次

# 在不开辟线程的基础上,执行多任务(多个任务交替执行的),又称为微线程

# 一般来说,协程有三种方式,待我一一道来


1. 首先是yield关键字,在def里面看到yield关键字可以理解是协程

yield协程

# 整体代码较简单,只需导入time包来进行耗时操作,剩下的靠代码来操作!

——在每个def里的最后加入yield,然后在程序入口创建函数变量并且next()来执行(利用死循环)

——结果是两个函数交替执行,完成多任务


2. 再一个就是greenlet,事先检查是否预装该包(在命令行输入pip3 list 查看)

greenlet

# 这个就有点不一样;

1. 导入greenlet和time

2. 创建任务(先不管g1.switch和g2.switch)

3. 程序入口,创建协程指定对应的任务greenlet.greenlet()

先切换到第一个任务g1.switch(),然后回到函数在第一个任务下切换到第二个任务g2.switch()

紧接着在第二个函数下又切换到第一个任务!

4. 这样就达到了多任务交替执行的结果

# greenlet框架封装的是yield,greenlet能够让程序员很直观的查看协程的切换


3. 这一种也是用的最多的方式,利用gevent

gevrnt

#  gevent封装是greenlet,可以根据耗时操作自动完成协程之间的切换执行

# 这种方式可以说是最清新的(个人觉得)(笑脸)

# 和前面两种不同的是,只要创建多个任务,然后就交给程序入口了,后期好维护!

# 说重点,程序入口创建协程指定的任务gevent.spawn()

——然后就不用管了,会自动执行协程,嘿嘿嘿!

#那么问题就来了,运行结果是没有任何数据输出;

1. 那是因为主线程没有等待协程执行完就退出了,所以每个任务加入join()等待

2. 还有就是耗时操作,gevent只认自己的耗时gevrnt.sleep();

要想识别time,前期导入monkey模块(在gevent里),然后打个补丁monkey.patch_all()就好了!


@总结;方式多,但都很简易,加油!

————来自江西九江的一纸黑字~~

相关文章

网友评论

    本文标题:协程

    本文链接:https://www.haomeiwen.com/subject/fpthjftx.html