写入命名管道时避免挂起,它会消失并返回

时间:2011-02-03 22:44:37

标签: python

我有一个程序将信息转储到命名管道中,如下所示:

cmd=open(destination,'w')
cmd.write(data)
cmd.close()

这很有效,直到管道(目标)在我的程序写入时消失。问题是它一直挂在写入部分(?) 我期待发生一些例外,但事实并非如此。 我该如何避免这种情况?

谢谢,

2 个答案:

答案 0 :(得分:4)

如果从管道读取的进程读取速度不如写入速度快,则脚本在尝试写入管道时将阻塞。来自维基百科article

  

“如果队列缓冲区填满,那么   发送程序暂停(阻止)   直到接收程序有一个   有机会阅读一些数据并腾出空间   在缓冲区。在Linux中,大小   缓冲区为65536字节。“

幸运的是,你有几个选择:

  • 信号模块允许您设置闹钟以突破写入呼叫。在规定的时间之后,SIGALRM信号将被发送到您的进程,如果您的信号处理程序引发异常,它将使您脱离写入。

  • 使用线程,您可以生成一个新线程来处理写入,如果它阻塞太久就会将其删除。

  • 您还可以使用fnctl模块使管道无阻塞(意味着呼叫不会等待,如果管道已满,它将立即失败):Non-blocking read on a subprocess.PIPE in python

  • 最后,您可以在尝试写入之前使用select模块检查管道是否已准备好写入,请注意,检查写入操作不是幂等的(例如,管道可能在检查之间填满并写作。

答案 1 :(得分:0)

我认为信号模块可以帮到你。检查此示例:

http://docs.python.org/library/signal.html#example

(该示例解决了可能未完成的open()来电,但可以通过简单的修改来对您的cmd.write()来电做同样的事情。)