【问题标题】:Python other way to wait for an eventPython等待事件的其他方式
【发布时间】:2017-06-28 17:39:25
【问题描述】:

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

【问题讨论】:

  • 您可以编写一个服务作为第一个程序。第二个程序将是客户端。当客户端完成写入文件时,它可以向服务发送一些请求以采取必要的操作。
  • 不幸的是,我认为您必须不断检查文件内容。一个选项是执行 time.sleep 命令,这样您就不会烧坏 cpu 或使用 cron 作业。两者本质上是在文件检查之间等待的相同实现。
  • 用 pyinotify - saltycrane.com/blog/2010/04/… 监控文件系统怎么样?或使用看门狗 - pythonhosted.org/watchdog ?
  • 您的需求与此类似 - stackoverflow.com/questions/182197/…,我猜。

标签: python performance loops


【解决方案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。更好的是,如果可能的话,将进程的输出重定向到标准输出并使用Popen 从标准输出读取进程的输出,然后将 Python 脚本的输出写入文件。

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多