代码之家  ›  专栏  ›  技术社区  ›  jimx

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

  •  0
  • jimx  · 技术社区  · 17 年前

    在大多数情况下,它们工作得很好,但偶尔,出于某种原因,客户端会收到重复记录。从日志中可以看出,管道似乎没有正确关闭,缓存是剩余的,所以下次服务时,之前和当前都会发送到客户端。问题是,在尝试繁殖时,这种情况并不总是发生,不幸的是,我一次也没能繁殖。

    web服务器:(webserver.py)

    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,
    

    那么,究竟是什么导致了这个骗局呢?如何触发它?目前的修复方法是每次都取消管道文件的链接并重新创建,以避免任何残留物,但我不知道这是否是一个合适的解决方案。

    3 回复  |  直到 17 年前
        1
  •  0
  •   Andy    17 年前

    如果你同时运行两个splitter.py副本,就会出现问题,几乎任何发生在你身上的事情都是合法的。尝试在webserver.py中添加一个进程id值,即:

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

    这可能很有启发性。

        2
  •  0
  •   Rhamphoryncus    17 年前

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

        3
  •  0
  •   jimx    17 年前