(23)socket多进程并发

(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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/lyj910313/p/10787430.html