协程不是由计算机提供,而是程序员人为创造的。
协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术吗,简而言之,其实就是通过一个线程实现代码块相互切换执行。
ruby
复制代码
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2022/3/17 19:38 # @Author : camellia # @Email : 805795955@qq.com # @File : coroutine.py # @Software: PyCharm # 测试协程程序 def fun1(): print('我在方法fun1中!') def fun2(): print('我在方法fun2中……') fun1() fun2()
实现协程大概有以下这么几种方法:
1. Greenlet,早期模块
2. Yield关键字
3. Asyncio装饰器(python3.4以上才有)
4. Async await关键字(python3.5以上才有)
一:greenlet(比较老旧,不建议使用)
1:安装greenlet
复制代码
pip3 install greenlet
2:基本使用
php
复制代码
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2022/3/17 19:38 # @Author : stone # @Email : 805795955@qq.com # @File : coroutine.py # @Software: PyCharm # 测试协程程序 from greenlet import greenlet def test1(): print(12) # 第二步 输出12 gr2.switch() # 第三步 切换test2函数 print(34) # 第六步 输出34 gr2.switch() # 第七步 切换test2函数 def test2(): print(56) # 第四步 输出56 gr1.switch() # 第五步 切换test1函数 print(78) # 第八步 输出78 gr1.switch() gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch() # 第一步 执行test1函数
执行上边的代码,输出:
复制代码
12 56 34 78
具体输出步骤请参照代码中的注释。
二:yield关键字(生成器)(比较老旧,不建议使用)
ruby
复制代码
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2022/3/17 19:38 # @Author : camellia # @Email : 805795955@qq.com # @File : coroutine.py # @Software: PyCharm # 测试协程程序 def fun1(): yield 1 # 第二步 输出 1 yield from fun2() # 第三步调用fun2 yield 2 # 第六步 输出 2 def fun2(): yield 3 # 第四步 输出 3 yield 4 # 第五步 输出 4 f1 = fun1() # 第一步调用fun1 for item in f1: print(item)
执行上边代码输出:
复制代码
1 3 4 2
具体输出步骤请参照代码中的注释。