gevent实现协程
协程这个概念在操作系统中是不存在的,但是可以通过协程的理念实现单线程内并发的效果。
协程可以实现单线程内的并发效果,不需要锁,通过协程可以!提高CPU的利用率。
实现方法:通过yield字段,在yield执行时,可以保存当前的函数的状态,然后再执行另外一个函数。
---yeild 关键字的使用(廖雪峰博客)+++
使用gevent模块
gevent 本身是不支持检测IO的,但是可以通过其中的monkey模块,实现遇到io自动切换协程
安装
pip3 install gevent
简单使用
from gevent import monkey;monkey.patch_all()
import time
from gevent import spawn
def heng():
print('哼')
time.sleep(2)
print('哼')
def ha():
print('哈')
time.sleep(3)
print('哈')
def heiheihei():
print('heiheihei')
time.sleep(5)
print('heiheihei')
start_time = time.time()
# 使用协程时,将比同步运行节省很多的时间
g1 = spawn(heng)
g2 = spawn(ha)
g3 = spawn(heiheihei)
g1.join()
g2.join()
g3.join()
print(time.time() - start_time)
协程实现tcp
from gevent import monkey;monkey.patch_all()
import socket
from gevent import spawn
def communication(conn):
while True:
try:
data = conn.recv(1024)
if len(data) == 0: break
conn.send(data.upper())
except ConnectionResetError as e:
print(e)
break
conn.close()
def server(ip, port):
server = socket.socket()
server.bind((ip, port))
server.listen(5)
while True:
conn, addr = server.accept()
spawn(communication, conn)
if __name__ == '__main__':
g1 = spawn(server, '127.0.0.1', 8080)
g1.join()
# 客户端
from threading import Thread, current_thread
import socket
def x_client():
client = socket.socket()
client.connect(('127.0.0.1',8080))
n = 0
while True:
msg = '%s say hello %s'%(current_thread().name,n)
n += 1
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8'))
if __name__ == '__main__':
for i in range(500):
t = Thread(target=x_client)
t.start()
License:
CC BY 4.0