Python 等待事件的其他方式

Python other way to wait for an event

我希望我的程序等到特定文件包含文本而不是空字符串。另一个程序将数据写入文件。当我 运行 第一个程序时,由于不断检查文件内容的 while 循环,我的计算机开始过热。除了那个循环我还能做什么?

更好的解决方案是从您的 Python 脚本中启动该过程:

from subprocess import call
retcode = call(['myprocess', 'arg1', 'arg2', 'argN'])

检查 retcode 是否为零,这意味着成功——您的过程 运行 成功,没有任何问题。您也可以使用 os.system 而不是 subprocess.call。一旦该过程完成,您就会知道现在可以读取文件了。

为什么这个方法比监控文件好?

  • 该过程可能会失败,并且您尝试读取的文件中可能没有输出。 在这种情况下,您的进程将一次又一次地检查文件,寻找数据,这会浪费内核 I/O 操作时间。没有什么可以保证该过程在任何时候都会成功。

  • 进程可能接收到信号,(即STOPCONT),如果进程接收到STOP信号,内核将停止过程,并且您可能无法从输出文件中读取任何内容,尤其是当您打算一次读取所有数据时,就像在对文件进行排序时一样。一旦进程接收到 CONT 信号,进程就会重新开始。基本上,这意味着您的 Python 脚本将尝试在进程停止时同时从文件中读取。

此方法的缺点是,在您的 Python 脚本处理文件输出之前,该过程需要先完成。 subprocess.call 块,在生成的进程首先完成之前,Python 解释器不会执行下一行,您可以改用非阻塞的 subprocess.Popen。更好的是,如果可能的话,将进程的输出重定向到 stdout 并使用 Popen 从其 stdout 读取进程的输出,然后将 Python 脚本的输出写入文件。