套接字对象可以与Python的多处理共享吗? socket.close()似乎不起作用

时间:2013-06-25 12:49:27

标签: python sockets multiprocessing ipc

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

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

Some sources表示套接字对象应该作为句柄与multiprocessing.Pipes和multiprocess.reduction共享,但它似乎没有什么区别。

编辑:我在Linux 64位上使用Python 2.7.4。

以下是演示此问题的示例实现。

server.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"

client.py

import socket

s = socket.socket()
s.connect(('', 5001))
print "connected"
buf = s.recv(1024)

print "buf: '" + buf +"'"

s.close()

1 个答案:

答案 0 :(得分:10)

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

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

while True:
    print "accepting"
    c, _ = s.accept()
    p = Process(target=process, args=(c,))
    p.start()
    print "started process"
    c.close()