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

标签 python sockets multiprocessing ipc

我正在编写一个服务器,它为每个客户端使用 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/

相关文章:

php - Mysql查询在wamp服务器mysql控制台中运行,但不通过python文件或控制台

python - 矩阵和向量的每一列之间的numpy协方差

python - 加速 GTK TreeView

sockets - 净值旋转重新连接处理程序

c# - 页面之间的套接字?

python - 如何从两个现有的单索引数据帧创建多索引数据帧?

c - 选择 "leader and follower"怎么办?

python - 在多个进程中运行整个 Twisted 应用程序

Python 多线程与多处理与顺序执行

python - 尝试多处理时无法 pickle 本地对象