我在python中遇到time.sleep()函数的问题。我正在运行一个脚本,需要等待另一个程序生成txt文件。虽然,这是一个非常古老的机器,所以当我睡眠python脚本时,我遇到了其他程序不生成文件的问题。有没有其他方法可以使用time.sleep()?我认为锁定线程可能会起作用,但实质上它只是一个锁定线程几秒钟的循环。我会在这里给出一些我正在做的伪代码。
While running:
if filesFound != []:
moveFiles
else:
time.sleep(1)
答案 0 :(得分:7)
执行非阻塞等待的一种方法是使用threading.Event:
import threading
dummy_event = threading.Event()
dummy_event.wait(timeout=1)
这可以是来自另一个线程的set()
,表示某些内容已经完成。 但如果您正在另一个线程中执行操作,则可以完全避免超时和事件,只需join
另一个线程:
import threading
def create_the_file(completion_event):
# Do stuff to create the file
def Main():
worker = threading.Thread(target=create_the_file)
worker.start()
# We will stop here until the "create_the_file" function finishes
worker.join()
# Do stuff with the file
如果你想要一个使用事件进行更精细控制的例子,我可以告诉你......
如果您的平台未提供线程模块,则线程方法将不起作用。例如,如果您尝试替换dummy_threading模块,dummy_event.wait()
会立即返回。不确定join()
方法。
如果您正在等待其他进程完成,最好使用subprocess模块从您自己的脚本管理它们(然后,例如,使用wait
方法确保这个过程在你做进一步的工作之前就完成了。)
如果您无法从脚本管理子流程,但您知道PID,则可以使用os.waitpid()
功能。如果在您使用此功能时该过程已经完成,请注意OSError
...
如果您想要一种跨平台的方式来观看目录以获得新文件的通知,我建议您使用GIO FileMonitor中的PyGTK/PyGObject。您可以使用monitor_directory的GIO.File方法在目录上获取监视器。
目录监视的快速示例代码:
import gio
def directory_changed(monitor, file1, file2, evt_type):
print "Changed:", file1, file2, evt_type
gfile = gio.File(".")
monitor = gfile.monitor_directory(gio.FILE_MONITOR_NONE, None)
monitor.connect("changed", directory_changed)
import glib
ml = glib.MainLoop()
ml.run()
答案 1 :(得分:-3)
检查标准库上“subprocess”模块的文档。 那里的Popen类允许以各种方式处理你调用的任何子进程。当你发现如何正确使用子进程时,你可能甚至不需要使用线程。
docuemntation在模块本身可用,只需
import subprocess
help(subprocess)