2010-08-05 148 views
3

python中的time.sleep()函数存在问题。我正在运行一个脚本,需要等待另一个程序生成txt文件。虽然这是一台非常古老的机器,所以当我睡觉python脚本时,遇到了其他程序不生成文件的问题。有没有其他方法可以使用time.sleep()?我认为锁定线程可能会工作,但实质上它只是一个锁定线程几秒钟的循环。我会在这里给我一些伪代码。Python中的time.sleep和多线程问题

While running: 
    if filesFound != []: 
     moveFiles 
    else: 
     time.sleep(1) 
+5

太假,无法真正帮助。无论如何,要监视新文件的目录,您可以在Windows中使用pyinotify,http://trac.dbzteam.org/pyinotify,“ReadDirectoryChangesW”(例如,请参阅http://tech-artists.org/wiki/Python_Recipes# Watch_a_Directory_for_Changes)等等。 – 2010-08-05 15:22:28

+0

没有什么可说的。它非常基本。我真的只是在寻找一种方法来等待文件被创建,而无需使用cpu(因此可以创建它们)。 – xZel 2010-08-05 17:53:22

回答

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 FileMonitorPyGTK/PyGObject。您可以使用GIO.Filemonitor_directory方法在目录上获得监视器。对于目录表

快速示例代码:

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() 
-3

检查标准库中“subprocess”模块的文档。 在那里的Popen类允许处理你调用的任何子过程的各种方式。当你发现如何正确使用子进程时,你可能甚至不需要使用线程。

的docuemntation是模块本身中,您只需要做做非阻塞等待

import subprocess 
help(subprocess)