我正在编写一个服务器,它为每个客户端使用 multiprocessing.Process。 socket.accept() 在父进程中被调用,连接对象作为参数提供给进程。
问题是调用 socket.close() 时套接字似乎没有关闭。在服务器上调用 close() 后,客户端的 recv() 应立即返回。当使用 threading.Thread 或仅在主线程中处理请求时就是这种情况,但是当使用多处理时,客户端的 recv 似乎永远挂起。
Some sources指示套接字对象应作为句柄与 multiprocessing.Pipes 和 multiprocess.reduction 共享,但这似乎没有什么区别。
编辑:我在 Linux 64 位上使用 Python 2.7.4。
下面是演示此问题的示例实现。
服务器.py
import socket
from multiprocessing import Process
#from threading import Thread as Process
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 5001))
s.listen(5)
def process(s):
print "accepted"
s.close()
print "closed"
while True:
print "accepting"
c, _ = s.accept()
p = Process(target=process, args=(c,))
p.start()
print "started process"
客户端.py
import socket
s = socket.socket()
s.connect(('', 5001))
print "connected"
buf = s.recv(1024)
print "buf: '" + buf +"'"
s.close()
最佳答案
问题是socket在父进程中没有关闭。因此它保持打开状态,并导致您观察到的症状。
在派生子进程处理连接后,您应该立即关闭父进程的套接字副本,如下所示:
while True:
print "accepting"
c, _ = s.accept()
p = Process(target=process, args=(c,))
p.start()
print "started process"
c.close()
关于python - 套接字对象可以与 Python 的多处理共享吗? socket.close() 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17297810/