刘刚刚的个人博客

gevent实现协程

创建时间:2020-09-12 11:31:21
更新时间:2020-09-12 11:31:21

协程这个概念在操作系统中是不存在的,但是可以通过协程的理念实现单线程内并发的效果。

协程可以实现单线程内的并发效果,不需要锁,通过协程可以!提高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()
我的名片

昵称:shuta

职业:后台开发(python、php)

邮箱:648949076@qq.com

站点信息

建站时间: 2020/2/19
网站程序: ANTD PRO VUE + TP6.0
晋ICP备18007778号