Python 使用多进程处理套接字

Python 使用多进程处理套接字,python,python-multiprocessing,Python,Python Multiprocessing,我有一个服务器,主进程接收套接字连接并将它们放入队列堆栈,另一个进程监视此堆栈并将其应用于处理连接的池进程。除了一件事之外,所有的工作都很好: 最后一个连接一直处于停滞状态,直到出现另一个连接,看起来最后一个连接无法关闭,但为什么 来自多处理导入队列、进程、池、管理器的 导入日期时间 导入套接字 def get_date(): return datetime.datetime.now().strftime(“%H:%M:%S”) 类服务器: 定义初始化(自身、主机、端口): self.ser

我有一个服务器,主进程接收套接字连接并将它们放入队列堆栈,另一个进程监视此堆栈并将其应用于处理连接的池进程。除了一件事之外,所有的工作都很好:

  • 最后一个连接一直处于停滞状态,直到出现另一个连接,看起来最后一个连接无法关闭,但为什么
来自多处理导入队列、进程、池、管理器的

导入日期时间
导入套接字
def get_date():
return datetime.datetime.now().strftime(“%H:%M:%S”)
类服务器:
定义初始化(自身、主机、端口):
self.server_address=主机、端口
self.server\u socket=socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)
def运行(自):
self.server\u socket.setsockopt(socket.SOL\u socket,socket.SO\u REUSEADDR,1)
self.server\u socket.bind(self.server\u地址)
self.server\u socket.listen(1)
打印('侦听地址:%s:%s'%self.server\u地址)
q=Manager().Queue()
进程(target=self.handle\u请求,args=(q,).start()
尽管如此:
client\u socket,address=self.server\u socket.accept()
打印('\n[%s]来自%s:%s%%的请求(获取日期(),*地址))
q、 put(客户端\u套接字)
client_socket.close()
del client_socket#client_socket.close()不工作
def帮助(自我、客户端\u套接字):
data=client_socket.recv(512)
客户端\u套接字发送(数据)
client_socket.close()
打印(数据[:50])
def处理请求(自我,q):
将池(进程=2)作为池:
尽管如此:
pool.apply\u async(self.help,(q.get(),)
服务器('localhost',8000).run()

关闭
不会真正关闭连接,除非没有其他进程持有引用,但关闭将影响所有进程。您可以在
client\u socket.close()之前调用
client\u socket.shutdown(socket.shutw)


更新:


close
未完全关闭连接的原因是有一个由
Manager()启动的进程。
正在保存引用。相反,使用
队列
将使
关闭
按预期工作。

关闭
不会真正关闭连接,除非没有其他进程持有引用,但
关闭
将影响所有进程。您可以在
client\u socket.close()之前调用
client\u socket.shutdown(socket.shutw)


更新:


close
未完全关闭连接的原因是有一个由
Manager()启动的进程。
正在保存引用。相反,使用
Queue
将使
close
按预期工作。

对于
del
语句的使用,这看起来不是一个好的用例。即使您无法解决套接字关闭问题,也不应该
del
任何事情。您应该在init parent listen socket之前启动子进程,否则,它将被共享给所有子进程。对于
del
语句的使用,这看起来不是一个好的用例。即使无法解决套接字关闭问题,也不应该删除任何内容。应该在init parent listen socket之前启动子进程,否则,它将共享给所有子进程。添加到的链接将很有帮助。添加到的链接将很有帮助。