1.什么是协程
2.io密集型,计算密集型
3.协程一个简单实现
import time def A(): while True: print("----A---") yield time.sleep(0.5) def B(c): while True: print("----B---") c.next() time.sleep(0.5) if __name__=='__main__': a = A() B(a)
4.协程-greenlet版:开发者可以控制那个协程执行
为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单
安装方式
使用如下命令安装greenlet模块:
sudo pip install greenlet
#coding=utf-8 from greenlet import greenlet import time def test1(): while True: print "---A--" gr2.switch() time.sleep(0.5) def test2(): while True: print "---B--" gr1.switch() time.sleep(0.5) gr1 = greenlet(test1) gr2 = greenlet(test2) #切换到gr1中运行 gr1.switch()
5.gevent:自动切换协程
greenlet已经实现了协程,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent
#coding=utf-8 #请使用python 2 来执行此程序 import gevent def f(n): for i in range(n): print gevent.getcurrent(), i g1 = gevent.spawn(f, 5) g2 = gevent.spawn(f, 5) g3 = gevent.spawn(f, 5) g1.join() g2.join() g3.join()
可以看到,3个greenlet是依次运行而不是交替运行
2) gevent切换执行
import gevent def f(n): for i in range(n): print gevent.getcurrent(), i #用来模拟一个耗时操作,注意不是time模块中的sleep gevent.sleep(1) g1 = gevent.spawn(f, 5) g2 = gevent.spawn(f, 5) g3 = gevent.spawn(f, 5) g1.join() g2.join() g3.join()
6.gevent版-TCP服务器
import sys import time import gevent from gevent import socket,monkey monkey.patch_all() def handle_request(conn): while True: data = conn.recv(1024) #阻塞,切换 if not data: conn.close() break print("recv:", data) conn.send(data) def server(port): s = socket.socket() s.bind(('', port)) s.listen(5) while True: cli, addr = s.accept() #阻塞,切换 gevent.spawn(handle_request, cli) if __name__ == '__main__': server(7788)