1.生成器
含有yield 的语句的函数就是生成器
def mytest():
for i in range(10):
res = yield i
print('res的值为%s' %res)
ge = mytest()
re = next(ge)
print('re的值为%s' %re)
ge.send(100)
re = next(ge)
使用时,先实例一个生成器,然后使用next()方法,生成器运行。直到遇到yield时,暂停。next()方法返回yield产生的数据。
send()方法:将send()方法传入的参数,传给yield,yield默认返回None。
2.协程
协程是单线程的,本质是单线程内多个函数切换执行。
如果一个协程阻塞,整个县城阻塞
3.greenlet协程
安装pip install greenlet
from greenlet import greenlet
import time
def product():
index = 0
while True:
index += 1
item = '包子%s' % index
print('生产了%s' % item)
time.sleep(1)
c.switch(index)
def consumer():
while True:
print(1)
item = p.switch()
print('消费者消费了%s' % item)
time.sleep(1)
p = greenlet(product)
c = greenlet(consumer)
c.switch()
4.gevent协程
封装了libev(基于epoll和greenlet两个库),以类似线程的方式使用协程。
安装pip install gevent
import gevent,socket
from gevent import monkey
monkey.patch_all()
server = socket.socket()
server.bind(('',8080))
server.listen(1000)
def task(conn):
while True:
r_data = conn.recv(1024)
if r_data:
conn.send(r_data)
print(r_data.decode('utf-8'))
else:
conn.close()
break
if __name__ == '__main__':
while True:
conn,addr = server.accept()
gevent.spawn(task,conn)
5.gevent队列实现生产者消费者模式
import gevent
from gevent import monkey
from gevent.queue import Queue
import time
monkey.patch_all()
def consumer(queue):
while True:
item = queue.get()
print('消费了%s' % item)
time.sleep(2)
def product(queue):
i = 1
while True:
item = '第%s个包子' % i
print('正在生产%s' % item)
queue.put(item)
i += 1
time.sleep(2)
if __name__ == '__main__':
queue = Queue()
c = gevent.spawn(consumer, queue)
p = gevent.spawn(product, queue)
gevent.joinall([c, p])