基于socket 实现单线程并发

基于socket 实现单线程并发:

  基于协程实现内IO的快速切换,我们必须提前导入from gevent import monkey;monkey pacth_all() 以为 gevent spawn 内部无法铺抓IO机制 

基于socket 实现单线程并发
    1.服务端:
from gevent import monkey; monkey.patch_all()
from gevent import spawn
import socket


def communicate(conn):
    # 信息交流层
    while True:
        try:
            data = conn.recv(1024)
            if len(data) == 0: break
            print(data)
            conn.send(data.upper())
        except BaseException:
            break
    conn.close()


def server():
    server = socket.socket()
    server.bind(('127.0.0.1', 8080))
    server.listen(5)
    while True:
        conn,addr = server.accept()
        spawn(communicate, conn)


if __name__ == '__main__':
    t = spawn(server)
    t.join()

  

2客户端 我们模拟了500个线程 虽然基于cpython 我们只能在一个进程 下面开一个线程 但是我们利用协程的机制
巧妙的 躲过的外部对于我们IO的捕获,在代码层内部实现来回切换 从而实现了单线程下的高并发
from threading import Thread,current_thread
import socket
import socket


def client():
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    n = 1
    while True:

        data = '%s%s'% (current_thread().name, n)

        print(data)
        n += 1
        client.send(data.encode('utf-8'))

        info = client.recv(1024)
        print(info.decode('utf-8'))


if __name__ == '__main__':
    for i in range(500):
        t = Thread(target=client)
        t.start()

  

猜你喜欢

转载自www.cnblogs.com/mofujin/p/10850857.html
今日推荐