Я пытаюсь создать простой сервер сокетов, используя новые классы 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()