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 서버 병발에 관한 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기