(1) Process模块开子进程实现
import socket
from multiprocessing import Process
def communicate(conn):
while True:
conn.send(b'hello')
print(conn.recv(1024))
if __name__ == "__main__":
sk = socket.socket()
# 对于服务器自己本身,一个程序只能绑定一个端口
# 同一个端口可以多个客户端来连接,
# 只要server_ip+ server_port +client_ip + cilent_port 不一样,就是唯一
sk.bind( ("127.0.0.1" , 9000))
sk.listen()
while True:
conn,addr = sk.accept()
Process(target=communicate,args=(conn,)).start()
(2)socketserver模块实现
功能:实现TCP同时连接多个客户端
并发:一个cpu同时不停地执行多个程序
import socketserver
# 自定义一个类 MyServer
class MyServer(socketserver.BaseRequestHandler):
# handle 方法是每当有一个客户端发起connect来接之后,自动执行handle
def handle(self):
print("--->执行这句话")
print(self.request) # conn
print(self.client_address) # addr
conn = self.request
# 避免端口报错
socketserver.TCPServer.allow_reuse_address = True
# ip 端口号 | 自定义类
server = socketserver.ThreadingTCPServer(("127.0.0.1", 9000), MyServer)
# 循环调用
server.serve_forever()
(3) 进程池实现
import socket
from multiprocessing import Pool
def talk(conn):
while True:
conn.send(b"hello")
print(conn.recv(1024))
conn.close()
if __name__ =="__main__":
sk = socket.socket()
sk.bind( ("127.0.0.1",9000) )
sk.listen()
# Pool默认获取cpu_counter cpu最大核心数 我的机器是6
p = Pool()
while True:
conn,addr = sk.accept()
p.apply_async(talk,args=(conn,))
sk.close()
(4) 多线程实现
import socket
from threading import Thread
def func(conn):
while True:
conn.send(b"hello")
print(conn.recv(1024))
conn.close()
if __name__ == '__main__':
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
while True:
conn,addr = sk.accept()
t = Thread(target=func,args=(conn,))
t.start()
sk.close()
(5) 协程实现 gevent
from gevent import monkey; monkey.patch_all()
from threading import current_thread as cthread
import socket,gvent,os,time
def talk(conn):
while True:
print(cthread().ident,os.getpid())
# time.sleep(0.1)
conn.send(b'hello')
print(conn.recv(1024))
sk = socket.socket()
sk.bind( ("127.0.0.1" ,9001))
sk.listen()
# 用一个线程接受了所有访问的连接.(因为利用了协程)
while True:
conn,addr = sk.accept()
# spawn 和 submit 用法一样 参数默认往后写就可以了
gevent.spawn(talk,conn)