4

我正在为每个客户端编写一个使用 multiprocessing.Process 的服务器。socket.accept() 在父进程中被调用,连接对象作为参数提供给进程。

问题是调用 socket.close() 时,套接字似乎没有关闭。客户端的 recv() 应该在服务器上调用 close() 后立即返回。使用 threading.Thread 或仅处理主线程中的请求时就是这种情况,但是在使用多处理时,客户端的 recv 似乎永远挂起。

一些消息来源表明套接字对象应该作为句柄与 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()
4

1 回答 1

10

问题是套接字没有在父进程中关闭。因此,它保持打开状态,并导致您正在观察的症状。

在分叉子进程以处理连接后,您应该立即关闭父进程的套接字副本,如下所示:

while True:
    print "accepting"
    c, _ = s.accept()
    p = Process(target=process, args=(c,))
    p.start()
    print "started process"
    c.close()
于 2013-06-25T13:21:50.810 回答