Python 如何调试一个奇怪的线程打开fifo问题?

Python 如何调试一个奇怪的线程打开fifo问题?,python,multithreading,stream,fifo,inetd,Python,Multithreading,Stream,Fifo,Inetd,web服务被配置为在接收USR1信号时公开其部分数据。当xinetd服务器接收到来自远程客户端(例如nc myserver 50666)的请求时,该信号将由xinetd服务器发送。当web服务器接收到USR1信号时,它会打开一个专用的fifo管道,将其数据写入该管道,然后关闭该管道。同时,xinetd服务器读取管道并将其馈送到远程客户端 在大多数情况下,它们工作得很好,但由于某些原因,客户端偶尔会收到dup记录。从日志中可以看出,管道似乎没有正确关闭,缓存是剩余的,因此,下次服务时,会将“上一次

web服务被配置为在接收USR1信号时公开其部分数据。当xinetd服务器接收到来自远程客户端(例如nc myserver 50666)的请求时,该信号将由xinetd服务器发送。当web服务器接收到USR1信号时,它会打开一个专用的fifo管道,将其数据写入该管道,然后关闭该管道。同时,xinetd服务器读取管道并将其馈送到远程客户端

在大多数情况下,它们工作得很好,但由于某些原因,客户端偶尔会收到dup记录。从日志中可以看出,管道似乎没有正确关闭,缓存是剩余的,因此,下次服务时,会将“上一次”和“当前”发送到客户端。问题是,当我试图繁殖时,它并不是经常发生,不幸的是,我一次也不能繁殖

以下是演示该过程的简单片段:

web服务器:(webserver.py)

xinetd.d服务器:(spitter.py)


那么到底是什么导致了dup?如何触发它?当前的修复程序我取消了管道文件的链接,每次都重新创建它以避免任何遗留问题,但我不知道这是否是一个正确的解决方案。

如果您同时运行两个splitter.py副本,将会有麻烦,并且几乎发生在您身上的任何事情都是合法的。尝试将进程id值添加到webserver.py,即:

write(str(os.getpid())+i+'\n')


这可能很有启发性。

这里没有足够的东西来调试。您不会显示服务器如何处理信号,也不会打开管道


如果可能的话,我建议不要使用信号。在C语言中,它们已经足够复杂了,更不用说在上面添加了python自己的特性。

所以真正的问题是存在多个客户端。该服务器已被其他未知客户端查询/滥用,这些客户端最初未与客户达成一致,并且在当前设计下肯定会崩溃。已部署修复程序来解决此问题。所以安迪的怀疑是对的。谢谢大家

正如我所想,这个解决方案有几个问题:1。它改变了输出。2.在目前的设计中没有竞争条件。客户机是一台分时拉纸机。(每隔几分钟拉一次,并且还没有其他客户机)这两个问题都与调试无关。事实上,我会添加时间戳,然后在读卡器端添加另一个时间戳。健全性检查很重要。根据您的建议,这里有什么更好的解决方案?基本上,我需要一个高效的IPC机制来在两个进程之间共享数据。谢谢Unix域套接字对于纯本地使用是最灵活的。如果有必要,您甚至可以传递文件描述符。否则,在本地主机上使用TCP。
def SendStream(data, pipe):
  try:
    for i in data:
      pipe.write(i + '\n') 
      pipe.flush()
  finally:
      pipe.close()

def Serve():
  threading.Thread(target=SendStream, args=(data, pipe)).start()
def Serve():
  if not os.path.exists(PIPE_FILE):
    os.mkfifo(PIPE_FILE)
  os.kill(server_pid, signal.SIGUSR1)
  for i in open(PIPE_FILE):
    print i,