用数据池来实现socket并发

最终目标:启动服务后可以有无数个访问,并且可以随时输入,服务端使用进程池。

服务端

from  socket import *
import os,time
from concurrent.futures import ProcessPoolExecutor
def func(conn,addr):
    while True:
        try:
            ret = conn.recv(1024)
            if not ret:break
            time.sleep(5)
            print(ret.decode('utf-8'))
            conn.send(ret.upper())
            print("端口号:【%s】是,进程ID:【%s】"% (addr[1],os.getpid()))
        except ConnectionResetError:
            break

if __name__ == "__main__":
    server = socket(AF_INET, SOCK_STREAM)
    server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    server.bind(('127.0.0.1', 8130))
    server.listen(5)

    p = ProcessPoolExecutor(2)
    while True:
        conn,addr = server.accept()
        p.submit(func,conn,addr)

客户端

from socket import *
while True:
    client = socket(AF_INET, SOCK_STREAM)   #这里使用的是伪链接,每输入一次都会断开,但客户端看起来一直与服务端保持着链接,其实没有
    data = input('>>>').strip()
    client.connect(('127.0.0.1',8130))
    client.send(data.encode('utf-8'))
    ret = client.recv(1024)
    print(ret.decode('utf-8'))
    client.close()

创建了4个客户端,执行结果

hgsdfa
端口号:【54815】是,进程ID:【15828】
eawd
端口号:【54817】是,进程ID:【5580】
few
端口号:【54819】是,进程ID:【15828】
few
端口号:【54820】是,进程ID:【5580】
cv;
端口号:【54829】是,进程ID:【15828】
g
端口号:【54831】是,进程ID:【5580】
#可以清楚的看到,进程ID只有两个,证明确实是在进程池中循环

相关推荐