gevent 实现服务器协程并发实验

发布时间 2023-03-31 22:55:39作者: MrSphere
# -*- coding: utf-8 -*-
# 服务器端代码
import socket

import gevent
from gevent import monkey

monkey.patch_all()


def serve(conn):
    while True:
        try:
            data = conn.recv(1024)
            if not data: break
            conn.send(data.upper())
        except ConnectionResetError:
            print(ConnectionResetError)
            break
    conn.close()


def server(IP, port, backlog=5):
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((IP, port))
    server.listen(backlog)

    print('server is listening ...')

    while True:
        conn, addr = server.accept()
        # 阻塞,一旦阻塞开始切换到协程中的其他任务执行
        gevent.spawn(serve, conn)
        # gevent make lightweight execution units based on greenlets,
        # execute the spawn method to spawn a unit with func addr(serve) and args(conn)
        # just do the func with args, and recognize IO tasks, do task by coroutine method, serve(conn)


if __name__ == '__main__':
    IP = '127.0.0.1'
    port = 8080
    g = gevent.spawn(server, IP, port)
    g.join()

import socket
from threading import Thread,current_thread
IP = '127.0.0.1'
port = 8080


def solution():
    # 客户端通信管道的生成必须放在函数体内部,否则只是单线程的反复连接
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((IP,port))
    while True:
        msg = f"{current_thread().name} say hello {current_thread()}"
        client.send(msg.encode('utf-8'))
        data = client.recv(1024)
        print(data.decode('utf-8'))


if __name__ == '__main__':
    threads = [Thread(target=solution) for i in range(50)]
    for i in threads:
        i.start()