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 操作时间。没有什么可以保证该过程在任何时候都会成功。
进程可能接收到信号,(即STOP
和CONT
),如果进程接收到STOP
信号,内核将停止过程,并且您可能无法从输出文件中读取任何内容,尤其是当您打算一次读取所有数据时,就像在对文件进行排序时一样。一旦进程接收到 CONT 信号,进程就会重新开始。基本上,这意味着您的 Python 脚本将尝试在进程停止时同时从文件中读取。
此方法的缺点是,在您的 Python 脚本处理文件输出之前,该过程需要先完成。 subprocess.call
块,在生成的进程首先完成之前,Python 解释器不会执行下一行,您可以改用非阻塞的 subprocess.Popen
。更好的是,如果可能的话,将进程的输出重定向到 stdout 并使用 Popen
从其 stdout 读取进程的输出,然后将 Python 脚本的输出写入文件。
我希望我的程序等到特定文件包含文本而不是空字符串。另一个程序将数据写入文件。当我 运行 第一个程序时,由于不断检查文件内容的 while 循环,我的计算机开始过热。除了那个循环我还能做什么?
更好的解决方案是从您的 Python 脚本中启动该过程:
from subprocess import call
retcode = call(['myprocess', 'arg1', 'arg2', 'argN'])
检查 retcode
是否为零,这意味着成功——您的过程 运行 成功,没有任何问题。您也可以使用 os.system
而不是 subprocess.call
。一旦该过程完成,您就会知道现在可以读取文件了。
为什么这个方法比监控文件好?
该过程可能会失败,并且您尝试读取的文件中可能没有输出。 在这种情况下,您的进程将一次又一次地检查文件,寻找数据,这会浪费内核 I/O 操作时间。没有什么可以保证该过程在任何时候都会成功。
进程可能接收到信号,(即
STOP
和CONT
),如果进程接收到STOP
信号,内核将停止过程,并且您可能无法从输出文件中读取任何内容,尤其是当您打算一次读取所有数据时,就像在对文件进行排序时一样。一旦进程接收到 CONT 信号,进程就会重新开始。基本上,这意味着您的 Python 脚本将尝试在进程停止时同时从文件中读取。
此方法的缺点是,在您的 Python 脚本处理文件输出之前,该过程需要先完成。 subprocess.call
块,在生成的进程首先完成之前,Python 解释器不会执行下一行,您可以改用非阻塞的 subprocess.Popen
。更好的是,如果可能的话,将进程的输出重定向到 stdout 并使用 Popen
从其 stdout 读取进程的输出,然后将 Python 脚本的输出写入文件。