您的位置:首页 > 编程语言 > Python开发

python 协程

2017-12-16 20:53 162 查看
通过 yield 方式实现

# -*- coding: utf-8 -*-

'''
协程,又称为线程,是一种用户装态的轻量级线程。
协程拥有自己的寄存器上下文和栈,在调度切换时,将寄存器上下文和栈保存在其他地方,
在切回来的时候恢复到先前保存的寄存器上下文和栈

协程的好处:
1.无需线程上下文切换的开销
2.方便切换控制流,简化编程模型
3.无需院子操作锁定及同步的开销
4.高并发,高扩展,低成本

缺点:
1.无法利用多核资源
2.阻塞操作会阻塞整个程序

'''

import time
import queue

def consumer(name):
print("------->start eating baozi")
while True:
#函数中有yield的时候这个函数会变成一个生成器,当调用__next()__方法的时候会继续运行
new_baozi = yield
print("[%s] is eating baozi %s"%(name,new_baozi))

def producer():
r = con.__next__()
r = con2.__next__()
n=0
while n<5:
n+=1
con.send(n)
con2.send(n)
print('%s making baozi '%n)

if __name__=='__main__':
con = consumer('c1')
con2 = consumer('c2')
p = producer()


greenlet 实现手动切换协程

# -*- coding: utf-8 -*-
from greenlet import  greenlet

def test1():
print(12)
gr2.switch()
print(34)
gr2.switch()

def test2():
print(56)
gr1.switch()
print(78)

#启动一个协程
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch() #协程的切换


gevent 实现自动切换

import gevent

def foo():
print('runing in foo')
gevent.sleep(2)
print('再次切回到foo')

def bar():
print("切换到bar")
gevent.sleep(1)
print('切换回bar')

gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: