python이 socket 서버 병발을 실현하는 네 가지 방식
다중 프로세스 & 다중 스레드
서비스 포트: 다중 프로세스와 다중 루틴의 오픈 방식은 같습니다.
단점: <1> Cpython의 GIL로 인해 같은 시간에 여러 개의 스레드를 실행할 수 없습니다.<2> 프로세스나 스레드를 무제한으로 시작할 수 없음
해결 방법: 다중 프로세스,concurrent.futures.ProcessPoolExecutor, 스레드 풀
import socket
from multiprocessing import Process
from threading import Thread
class MyTcpServer:
def __init__(self, ip, port):
self.ip = ip
self.port = port
self.server = socket.socket()
self.server.bind((self.ip, self.port))
self.server.listen(5)
def wait_accept(self):
conn, addr = self.server.accept()
return conn, addr
def handle_request(self, conn):
while 1:
try:
data = conn.recv(1024)
if not data: break
conn.send(data.upper())
except Exception as e:
print(e)
break
conn.close()
if __name__ == '__main__':
server = MyTcpServer('127.0.0.1', 8888)
while 1:
conn, addr = server.wait_accept()
p = Process(target=server.handle_request, args=(conn, )) #
p.start() # ,
프로세스 탱크 & 스레드 탱크
비동기적으로 작업을 제출하고 비동기적으로 결과를 수신할 수 있습니다 (submit는 futures 대상을 되돌려주고 add_done_callback 방법을 호출합니다)
import socket
from concurrent.futures import ProcessPoolExecutor
# from concurrent.futures import ThreadPoolExecutor
class MyTcpServer:
def __init__(self, ip, port):
self.ip = ip
self.port = port
self.server = socket.socket()
self.server.bind((self.ip, self.port))
self.server.listen(5)
def wait_accept(self):
conn, addr = self.server.accept()
return conn, addr
def handle_request(self, conn):
while 1:
try:
data = conn.recv(1024)
if not data: break
conn.send(data.upper())
except Exception as e:
print(e)
break
conn.close()
if __name__ == '__main__':
server = MyTcpServer('127.0.0.1', 8888)
pool = ProcessPoolExecutor(5) # 5
while 1:
conn, addr = server.wait_accept()
pool.submit(server.handle_request, conn) #
socketserver
장점: socket 서버 생성 절차를 간소화합니다.
서버 직렬 및 병렬 서비스 모드 제공(TCPServerver, ThreadingTCPServer)
단점: 윈도우즈에서 다중 프로세스를 사용하여 병행할 수 없음
import socketserver
class MyTcpHandler(socketserver.BaseRequestHandler):
def handle(self): #
while 1:
try:
data = self.request.recv(1024)
if not data: break
self.request.send(data.upper())
except Exception as e:
print(e)
break
self.request.close()
if __name__ == '__main__':
ip_port = '127.0.0.1', 8888
server = socketserver.ThreadingTCPServer(ip_port, MyTcpHandler) #
server.serve_forever() #
협정하다장점: 단일 스레드 내 동시 실행, 코드 레벨 아날로그 IO 전환, 프로그램 운영 효율 향상
from gevent import spawn, monkey;monkey.patch_all() # , : IO
import socket
class MyTcpServer:
def __init__(self, ip, port, my_spawn):
self.ip = ip
self.port = port
self.server = socket.socket()
self.server.bind((self.ip, self.port))
self.server.listen(5)
self.spawn = my_spawn # spawn
def wait_accept(self):
while 1:
conn, addr = self.server.accept()
self.spawn(self.handle_request, conn) # handle_request io
def handle_request(self, conn):
while 1:
try:
data = conn.recv(1024)
if not data: break
conn.send(data.upper())
except Exception as e:
print(e)
break
conn.close()
if __name__ == '__main__':
server = MyTcpServer('127.0.0.1', 8888, spawn)
g1 = server.spawn(server.wait_accept) # wait_accept io
g1.join() # g1 , io
이상은python이 socket 서버 병발을 실현하는 네 가지 방식의 상세한 내용입니다. 더 많은python socket 서버 병발에 관한 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.