用数据池来实现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只有两个,证明确实是在进程池中循环
复制代码

 

posted @   明王不动心  阅读(292)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示