2011-09-25 1 views
0

새로운 concurrent.futures 클래스를 사용하여 간단한 소켓 서버를 만들려고합니다. 내가 ThreadPoolExecutor와 함께 잘 작동하도록 할 수는 있지만, ProcessPoolExecutor를 사용할 때 멈춰 버리고 그 이유를 이해할 수 없습니다. 상황을 감안할 때, 나는 그것이 피클 할 수없는 아이 프로세스에 무언가를 전달하려고 시도하는 것과 관련이 있다고 생각했지만, 그렇지 않습니다. 내 코드의 단순화 된 버전은 아래와 같습니다. 나는 어떤 조언을 주셔서 감사하겠습니다.Python 3 concurrent.futures 소켓 서버는 ThreadPoolExecutor와 함께 작동하지만 ProcessPoolExecutor에서는 작동하지 않습니다.

import concurrent.futures 
import socket, os 

HOST = '' 
PORT = 9001 

def request_handler(conn, addr): 
    pid = os.getpid() 
    print('PID', pid, 'handling connection from', addr) 
    while True: 
     data = conn.recv(1024) 
     if not data: 
      print('PID', pid, 'end connection') 
      break 
     print('PID', pid, 'received:', bytes.decode(data)) 
     conn.send(data) 
    conn.close() 

def main(): 
    with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor: 
     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: 
      sock.bind((HOST, PORT)) 
      sock.listen(10) 
      print("Server listening on port", PORT) 
      while True: 
       conn, addr = sock.accept() 
       executor.submit(request_handler, conn, addr) 
       conn.close() 
      print("Server shutting down") 


if __name__ == '__main__': 
    main() 
+1

도움이된다면, 작업자가 심하게 죽으면 (예 : 종료 값 0이없는 경우) Python 3.2에서 ProcessPoolExecutor가 교착 상태가되는 것으로 알려져 있습니다. – donkopotamus

+0

좋은 전화 @Donkopotamus, 당신은 코멘트 대신 대답으로 게시 했어야합니다. – ThatAintWorking

답변

0

좋은 전화 Donkopotamus, 당신은 대답으로 게시해야합니다.

try-block에서 처리기를 래핑하고 conn.recv()를 호출하려고 할 때 예외가 발생했습니다. [Errno 10038] 소켓이 아닌 것에 작업이 시도되었습니다. 작업자 프로세스가 심하게 죽어 가고 있기 때문에 교착 상태가되었습니다. 오류를 잡아내는 try 블록을 사용하면 교착 상태없이 원하는만큼 연결할 수 있습니다.

ThreadPoolExecutor를 사용하도록 코드를 변경하면이 오류가 발생하지 않습니다. 몇 가지 옵션을 시도하고 ProcessPoolExecutor의 작업자 프로세스에 소켓을 제대로 전달할 수있는 방법이없는 것처럼 보입니다. 나는 인터넷에서 이것에 대한 다른 언급을 발견했으나 일부 ​​플랫폼에서는 할 수 있지만 다른 것들에서는 할 수 없다고 말한다. 나는 Windows, Linux 및 MacOS X에서이 기능을 시도했지만 그 중 일부에서는 작동하지 않습니다. 이것은 중요한 한계처럼 보입니다.

0

'executor.submit (...)'을 실행 한 후 'conn.close()'가 발생하지 않았습니까? 난 그냥 라인을 제거하고 mac10.12.6 및 파이썬 3.6.3에서 잘 작동합니다.

관련 문제