• 用数据池来实现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只有两个,证明确实是在进程池中循环
  • 相关阅读:
    C#Web网站的创建
    C#Repeater控件的使用
    C#LINQ
    C#异常处理
    C#LINQ
    C#匿名委托,匿名函数,lambda表达式
    C#chart图表的应用
    C#用户控件的使用
    用 Python写 daemon
    CentOS 5.4 制作 Python 2.6 RPM 包的方法
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7932344.html
Copyright © 2020-2023  润新知