juk*_*uke 4 python sockets ipc multiprocessing
我正在编写一个服务器,它为每个客户端使用multiprocessing.Process.socket.accept()在父进程中被调用,连接对象作为Process的参数给出.
问题是,当调用socket.close()时,套接字似乎没有关闭.客户端的recv()应该在服务器上调用close()后立即返回.这是使用threading.Thread或只是处理主线程中的请求的情况,但是当使用多处理时,客户端的recv似乎永远挂起.
一些来源表明套接字对象应该作为句柄与multiprocessing.Pipes和multiprocess.reduction共享,但它似乎没有什么区别.
编辑:我在Linux 64位上使用Python 2.7.4.
以下是演示此问题的示例实现.
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"
Run Code Online (Sandbox Code Playgroud)
import socket
s = socket.socket()
s.connect(('', 5001))
print "connected"
buf = s.recv(1024)
print "buf: '" + buf +"'"
s.close()
Run Code Online (Sandbox Code Playgroud)
Cel*_*ada 10
问题是父进程中的套接字未关闭.因此它保持打开状态,并导致您观察到的症状.
在分离子进程以处理连接之后,您应该立即关闭父进程的套接字副本,如下所示:
while True:
print "accepting"
c, _ = s.accept()
p = Process(target=process, args=(c,))
p.start()
print "started process"
c.close()
Run Code Online (Sandbox Code Playgroud)