Python套接字子进程连接一段时间后没有回复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python套接字子进程连接一段时间后没有回复相关的知识,希望对你有一定的参考价值。

我正在使用python套接字与后端服务进行通信(B < - > C,如下面的结构所示​​):

                spawn                    Popen
 NodeJS server ------- Python Subprocess ------ backend process
         A                      B                     C

每次当我启动套接字时,它都很有效 - 但是当我停止测试时,经过几个小时我再次测试它时,它将不会返回答案。

我听说可能有一个问题:

如果客户端由于某种原因断开连接,您将从conn.recv获取EOF(空字符串)。然后你将写一个空字符串(零字节)并刷新到p.stdin,这是一个无操作。然后你的子进程将永远等待。

但是我该如何解决这个问题呢?

我改进了我的代码,但仍然没有工作。这是代码:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, port))
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
s.listen(10)

conn, addr = s.accept()

while(conn):
    data = conn.recv(1024)
    while(data):
        if not data:
            break
        p.stdin.write(data)
        p.stdin.flush()
        result = p.stdout.readline()
        conn.sendall(result)
        break
    conn.close()
    conn, addr = s.accept()
s.close()

有什么想改进代码吗?谢谢。

答案

该程序的逻辑是:

while connected:
    send request from network peer to backend
    send reply from backend to network peer

它容易崩溃的原因是因为它假设一个网络读取返回一个请求。然而,对于网络流(即TCP),不能保证数据边界。输入可以到达一个数据包,但也可以在几个网络数据包中,并且可能需要多次读取(或recvs)来获取整个数据 - 即使另一端在一次网络写入中发送它。

当不完整的请求被发送到后端进行处理时,程序会等待回复,而后端仍然等待请求的其余部分。通信不同步,结果就是死锁。

要修复它,两个程序都必须遵循通信协议规则。何时发送,发送什么以及何时接收。

以上是关于Python套接字子进程连接一段时间后没有回复的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 每个 Tcp 连接的进程

window error 10060 由于连接方在一段时间后没有正确答复或者连接主机没有反应,连接尝试失败!

Popen 子进程进程在特定回复后停止阅读

python全栈脱产第37天------进程池与线程池协程gevent模块单线程下实现并发的套接字通信

百万年薪python之路 -- 并发编程之 多进程二

一段时间后,当从 Windows SSH 到 linux 机器时,子进程(在分叉后创建)卡在 Windows 上