2010-08-05 6 views
3

J'ai un problème avec la fonction time.sleep() dans python. J'exécute un script qui doit attendre qu'un autre programme génère des fichiers txt. Bien que ce soit une machine terriblement ancienne, alors quand je dors le script python, je rencontre des problèmes avec l'autre programme qui ne génère pas de fichiers. Existe-t-il des alternatives à l'utilisation de time.sleep()? Je pensais que verrouiller le fil pourrait fonctionner mais essentiellement ce serait juste une boucle de verrouillage du fil pendant quelques secondes. Je vais donner un pseudo code de ce que je fais.Problèmes avec time.sleep et Multithreading en Python

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

Trop pseudo, ne peut pas vraiment aider. Quoi qu'il en soit, pour surveiller un répertoire de nouveaux fichiers, vous pouvez utiliser pyinotify, http://trac.dbzteam.org/pyinotify, 'ReadDirectoryChangesW' dans Windows (par exemple, voir http://tech-artists.org/wiki/Python_Recipes# Watch_a_Directory_for_Changes), etc. –

+0

Il n'y a pas grand chose d'autre à dire. C'est assez basique. Je suis vraiment à la recherche d'un moyen d'attendre la création de fichiers, sans utiliser le processeur (afin qu'ils puissent être créés). – xZel

Répondre

7

Une façon de faire une attente non bloquante est d'utiliser threading.Event:

import threading 
dummy_event = threading.Event() 
dummy_event.wait(timeout=1) 

Cela peut être set() d'un autre fil pour indiquer que quelque chose est terminé. Mais si vous faites des choses dans un autre thread, vous pouvez éviter le délai d'attente et d'événements tout à fait et juste join l'autre fil:

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 

Si vous voulez un exemple d'utilisation d'événements pour le contrôle plus fin, je peut vous montrer que ...

L'approche de thread ne fonctionnera pas si votre plate-forme ne fournit pas le module de filetage. Par exemple, si vous essayez de remplacer le module dummy_threading, dummy_event.wait() renvoie immédiatement. Je ne suis pas sûr de l'approche join(). Si vous attendez que d'autres processus se terminent, il vaut mieux les gérer à partir de votre propre script en utilisant le module subprocess (puis, par exemple, en utilisant la méthode wait pour être sûr que le processus est terminé avant de faire la poursuite des travaux).

Si vous ne pouvez pas gérer le sous-processus à partir de votre script, mais que vous connaissez le PID, vous pouvez utiliser la fonction os.waitpid(). Méfiez-vous des OSError si le processus a déjà terminé au moment où vous utilisez cette fonction ...

Si vous voulez un moyen multi-plateforme pour regarder un répertoire pour être informé de nouveaux fichiers, je suggère d'utiliser un GIO FileMonitor à partir de PyGTK/PyGObject. Vous pouvez obtenir un moniteur sur un répertoire en utilisant la méthode monitor_directory d'un GIO.File.

exemple de code rapide pour une montre de répertoire:

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

Vérifiez la documentation du module "sous-processus" sur la bibliothèque standard. La classe Popen permet de gérer différents sous-processus que vous appelez. Vous n'aurez probablement même pas besoin d'utiliser des threads lorsque vous découvrirez comment utiliser correctement les sous-processus.

Le docuemntation est disponible dans le module lui-même, il suffit de faire

import subprocess 
help(subprocess)