-
协程多用在函数间切换,轻量级使用资源,生成器是实现协程的基本方式,这里首先看一下专门用作协程的模块greenlet。
import greenlet def func1(): print("eat starting") g2.switch() print("eat end") g2.switch() def func2(): print("play starting") # g1.switch() print("play end") g1 = greenlet.greenlet(func1) g2 = greenlet.greenlet(func2) func1()
这样调用switch方法,可以在函数中切换到另外一个函数中执行。
Gevent
- 通常在开启协程时,使用gevent模块:
import gevent
import time
def func1():
print("eat starting")
gevent.sleep(1) # 使用gevent.sleep()可以感知到这个耗时动作
print("eat end")
def func2():
print("play starting")
gevent.sleep(1)
print("play end")
g1 = gevent.spawn(func1)
g2 = gevent.spawn(func2)
g1.join()
g2.join()
- 在协程导入前加入from gevent import monkey;monkey.patch_all(),可以感知下面所有包的耗时操作,这样就可以自动开启协程了
from gevent import monkey;monkey.patch_all()
import gevent
import time
def func1():
print("eat starting")
time.sleep(1) # 这里使用time操作就可以了
print("eat end")
def func2():
print("play starting")
time.sleep(1)
print("play end")
g1 = gevent.spawn(func1)
g2 = gevent.spawn(func2)
g1.join()
g2.join()
- 进程和线程的任务切换由操作系统完成
- 协程任务之间的切换由程序完成,只有遇到协程模块能识别的IO操作的时候,程序才会进行任务切换,实现并发的效果。
- gevent.joinall() 可以开启一个可迭代对象中的所有协程。
from gevent import monkey;monkey.patch_all()
import gevent
import time
def func1():
print("eat starting")
time.sleep(1) # 这里使用time操作就可以了
print("eat end")
g_list = []
for i in range(10):
g = gevent.spawn(func1)
g_list.append(g)
gevent.joinall(g_list)