python 协程

协程之yield

#coding=utf-8
import time
def A():
        while True:
                print('---A---')
                yield 
                time.sleep(0.5)

def B(c):
        while True:
                print('---B---')
                next(c)
                time.sleep(0.5)
if __name__ == '__main__':
        a=A()
        B(a)
[chaoge@localhost mypython]$ python3 coroutine01.py
---B---
---A---
---B---
---A---
---B---
---A---

协程之greenlet

#安装greenlet:pip3 install greenlet
#coding=utf-8
from greenlet import greenlet
import time

def coroutine1():
        while True:
                print('---A---')
                gr2.switch()
                time.sleep(0.5)

def coroutine2():
        while True:
                print('---B---')
                gr1.switch()
                time.sleep(0.5)


gr1 = greenlet(coroutine1)
gr2 = greenlet(coroutine2)


gr1.switch()
[chaoge@localhost mypython]$ python3 greenlet01.py
---A---
---B---
---A---
---B---
---A---
---B---
---A---
---B---
---A---

协程之gevent

#coding=utf-8
#安装:pip3 install gevent
import gevent
def f(n):
        for i in range(n):
                print(gevent.getcurrent(),i)
                #遇到耗时操作,自动切换
                gevent.sleep(1)

g1 = gevent.spawn(f,5)
g2 = gevent.spawn(f,5)
g3 = gevent.spawn(f,5)

g1.join()
g2.join()
g3.join()
[chaoge@localhost mypython]$ python3 gevent01.py 
<Greenlet at 0x7f43ce24fc28: f(5)> 0
<Greenlet at 0x7f43c6f59930: f(5)> 0
<Greenlet at 0x7f43c6f599c8: f(5)> 0
<Greenlet at 0x7f43ce24fc28: f(5)> 1
<Greenlet at 0x7f43c6f59930: f(5)> 1
<Greenlet at 0x7f43c6f599c8: f(5)> 1
<Greenlet at 0x7f43ce24fc28: f(5)> 2
<Greenlet at 0x7f43c6f59930: f(5)> 2
<Greenlet at 0x7f43c6f599c8: f(5)> 2
<Greenlet at 0x7f43ce24fc28: f(5)> 3
<Greenlet at 0x7f43c6f59930: f(5)> 3
<Greenlet at 0x7f43c6f599c8: f(5)> 3
<Greenlet at 0x7f43ce24fc28: f(5)> 4
<Greenlet at 0x7f43c6f59930: f(5)> 4
<Greenlet at 0x7f43c6f599c8: f(5)> 4


gevent版-TCP并发服务器

#coding=utf-8
#gevent版-TCP并发服务器
import sys
import time
import gevent
#导入gevent中的socket
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)		
[chaoge@localhost mypython]$ python3 gevent02.py       
recv: b'hello'
recv: b'hello'
recv: b'hello'

原文地址:https://www.cnblogs.com/fonyer/p/8871450.html