Python等待事件的其他方式

时间:2017-06-28 17:39:26

标签: python performance loops

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

1 个答案:

答案 0 :(得分:1)

更好的解决方案是从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脚本的输出写入文件。