协程
什么是协程?
协程就是单线程下实现并发。是由用户自己控制调度的,也就是说需要在应用程序里实现。
协程的实现
Greenlet模块
from greenlet import greenlet import time
def eat(name):
print('%s eat 1'%name) g2.switch('rose')
print('%s eat 2'%name) g2.switch() def play(name):
print('%s play1'%name) g1.switch()
print('%s play2'%name)
g1 = greenlet(eat) g2 =greenlet(play)
g1.switch('lucy')
lucy eat 1
rose play1
lucy eat 2
rose play2 |
Greenlet可以很方便地实现切换,但是他不会监测IO,不能实现IO阻塞就切换。
Gevent模块
import gevent
def eat(name):
print('%s eat 1' % name) gevent.sleep(2)
print('%s eat 2' % name)
def play(name):
print('%s play' % name) gevent.sleep(2)
print('%s play' % name)
g1 = gevent.spawn(eat, 'lucy') g2 = gevent.spawn(play, 'lile')
g1.join() g2.join()
lucy eat 1
lile play
lucy eat 2
lile play |
Gevent模块提高了执行效率,实现了并发操作,但是gevent.sleep()就可以监测自身,如果把这个改成time.sleep()就不会切换任务了,但是gevent下有个宝贝:
from gevent import monkey;monkey.patch_all() import gevent import time def eat(name):
print('%s eat 1' % name) time.sleep(2)
print('%s eat 2' % name)
def play(name):
print('%s play' % name) time.sleep(2)
print('%s play' % name)
g1 = gevent.spawn(eat, 'lucy') g2 = gevent.spawn(play, 'lile')
# g1.join() # g2.join() # 等待执行完才结束进程
gevent.joinall([g1,g2]) # 同上,等待所有
|
就把IO阻塞变成非阻塞,但是一定要在文件开头写上。