念念不忘,必有回响!繁华似锦觅安宁,淡云流水度此生--------潇洒若梦&&浮生执铭
潇洒浮生
因为你 我愿意热爱整个世界

协程

什么是协程?

协程就是单线程下实现并发。是由用户自己控制调度的,也就是说需要在应用程序里实现。

协程的实现

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阻塞变成非阻塞,但是一定要在文件开头写上。

posted on 2018-10-09 10:58  潇洒浮生  阅读(253)  评论(0编辑  收藏  举报

levels of contents