我有一个程序将信息转储到命名管道中,如下所示:
cmd=open(destination,'w')
cmd.write(data)
cmd.close()
这很有效,直到管道(目标)在我的程序写入时消失。问题是它一直挂在写入部分(?) 我期待发生一些例外,但事实并非如此。 我该如何避免这种情况?
谢谢,
杰
答案 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()
来电做同样的事情。)