1 使用进程池实现socket 通信


ftp服务端

#!/usr/bin/python
# -*- coding utf8 -*- 

from multiprocessing import Process,Pool
from socket import *
import os

server=socket(AF_INET,SOCK_STREAM)
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
server.bind(('127.0.0.1',8080))
server.listen(5)
def talk(conn,addr):
    print(os.getpid())
    while True:#通讯循环
        try:
            msg=conn.recv(1024)
            if not msg:break
            conn.send(msg.upper())
        except Exception:
            break

if __name__ == '__main__':
    pool=Pool()
    res_l=[]
    while True:#链接循环

        conn,addr=server.accept()
        print(addr)
        #pool.apply(talk,args=((conn,addr)))    #同步
        res=pool.apply_async(talk, args=((conn, addr)))
        res_l.append(res)

        # p=Process(target=talk,args=((conn,addr)))
        #p.start()

客户端信息

#!/usr/bin/python
# -*- coding utf8 -*- 

from multiprocessing import Process
from socket import *
client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))
while True:
    msg=input('msg: ').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    msg2=client.recv(1024)
    print(msg2.decode('utf-8'))


可以多开几个客户端 然后执行

此示例的cpu_count()为4

启动了5个客户端

执行之后呢  第五个客户端挂起 这时候呢 关闭任意一个客户端 挂起的客户端会执行 

服务端看到他的pid是关掉的那个 等同于复用了pid

这样就避免了进程过多

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐