实现socket 并发连接的几种方式

1. socketserver

服务端:

# socketserver Server
import socketserver

class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            conn = self.request
            conn.send("Server ... ".encode()) msg = conn.recv(1024).decode() print(msg) conn.close() server = socketserver.ThreadingTCPServer(("127.0.0.1",9000),MyServer) server.serve_forever()

客户端:

# socketserver Client
import socket,os,time
sk = socket.socket()

sk.connect(("127.0.0.1",9000))

while True:
    msg = sk.recv(1024).decode()
    print(msg) time.sleep(1) msg2 = "process:%s"%(os.getpid()) sk.send(msg2.encode()) sk.close()

2. 进程池Pool

服务端:

# 进程池Pool Server
from multiprocessing import Pool
import socket,os

def func(conn,addr):
    while True:
        conn.send("Server ...".encode())
        
        msg = conn.recv(1024).decode() print("pid %s >>>:%s"%(os.getpid(),msg)) conn.close() if __name__ == "__main__": sk = socket.socket() sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sk.bind(("127.0.0.1",9000)) sk.listen() p = Pool(5) while True: conn,addr = sk.accept() p.apply_async(func,args=(conn,addr)) p.close() p.join() sk.close()

客户端:

# 进程池Pool Client
import socket

sk = socket.socket()
sk.connect(("127.0.0.1",9000))

while True:
    msg = sk.recv(1024).decode()
    print(msg) msg2 = input("Client >>>:") sk.send(msg2.encode()) sk.close()

3. 进程池ProcessPoolExecutor

服务端:

# 进程池ProcessPoolExecutor Server

from concurrent.futures import ProcessPoolExecutor
import socket,os

def func(conn):
    while True:
        conn.send("server ...".encode())
        
        msg = conn.recv(1024).decode() print("pid %s >>>:%s"%(os.getpid(),msg)) if __name__ == "__main__": sk = socket.socket() sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sk.bind(("127.0.0.1",9000)) sk.listen() # 默认进程数 = 逻辑处理器个数 p = ProcessPoolExecutor(6) while True: conn,addr = sk.accept() p.submit(func,conn) p.shutdown() sk.close()

客户端:

# 进程池ProcessPoolExecutor Client

import socket

sk = socket.socket()
sk.connect(("127.0.0.1",9000))

while True:
    msg = sk.recv(1024).decode()
    print(msg) msg2 = input("input:") sk.send(msg2.encode()) sk.close()

4. 线程池ThreadPoolExecutor

服务端:

# 线程池ThreadPoolExecutor Server
from concurrent.futures import ThreadPoolExecutor
from threading import currentThread
import socket

def func(conn):
    while True:
        conn.send("server ... ".encode()) msg = conn.recv(1024).decode() print("thread %s >>>:%s"%(currentThread().ident,msg)) if __name__ == "__main__": sk = socket.socket() sk.bind(("127.0.0.1",9000)) sk.listen() # 默认最大线程数 = 逻辑处理器个数 * 5 tp = ThreadPoolExecutor(3) while True: conn,addr = sk.accept() tp.submit(func,conn) tp.shutdown() sk.close()

客户端:

# 线程池ThreadPoolExecutor Client

import socket

sk = socket.socket()
sk.connect(("127.0.0.1",9000))

while True:
    msg = sk.recv(1024).decode()
    print(msg) msg2 = input("input:") sk.send(msg2.encode()) sk.close()

5. 协程

服务端:

# 协程gevent Server
from gevent import monkey;monkey.patch_all()
import socket,gevent

def func(conn):
    while True:
        conn.send("server ...".encode())
        
        msg = conn.recv(1024).decode() print(">>>:%s"%(msg)) if __name__ == "__main__": sk = socket.socket() sk.bind(("127.0.0.1",9000)) sk.listen() while True: conn,addr = sk.accept() g = gevent.spawn(func,conn) sk.close()

客户端:

# 协程gevent Client
from concurrent.futures import ThreadPoolExecutor
from threading import currentThread
import socket

sk = socket.socket()
sk.connect(("127.0.0.1",9000))

def func(): while True: msg = sk.recv(1024).decode() print(msg) msg2 = "thread %s"%(currentThread().ident) sk.send(msg2.encode()) tp = ThreadPoolExecutor(3) while True: tp.submit(func) tp.shutdown() sk.close()

猜你喜欢

转载自www.cnblogs.com/weige007/p/12098793.html