[英]How to create a socket object using multiprocessing and pass it back to the parent process
[英]using multiprocessing to handle socket
我有一台服务器,其主进程接受套接字连接,并将其放入队列堆栈,另一个进程监视该堆栈,并将其应用于处理连接的池进程。 除了一件事,一切正常:
from multiprocessing import Queue, Process, Pool, Manager
import datetime
import socket
def get_date():
return datetime.datetime.now().strftime('%H:%M:%S')
class Server:
def __init__(self, host, port):
self.server_address = host, port
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def run(self):
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(self.server_address)
self.server_socket.listen(1)
print('listen at: %s:%s' % self.server_address)
q = Manager().Queue()
Process(target=self.handle_request, args=(q,)).start()
while True:
client_socket, adress = self.server_socket.accept()
print('\n[%s] request from: %s:%s' % (get_date(), *adress))
q.put(client_socket)
client_socket.close()
del client_socket # client_socket.close() not working
def help(self, client_socket):
data = client_socket.recv(512)
client_socket.send(data)
client_socket.close()
print(data[:50])
def handle_request(self, q):
with Pool(processes=2) as pool:
while True:
pool.apply_async(self.help, (q.get(),))
Server('localhost', 8000).run()
除非没有其他进程持有引用,否则close
不会真正关闭连接,但是shutdown
将影响所有进程。 您可以在client_socket.close()
之前调用client_socket.shutdown(socket.SHUT_WR)
client_socket.close()
。
更新:
close
未完全关闭连接的原因是Manager()
启动的进程正在保存引用。 使用Queue
可以使close
工作如您所愿。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.