3 votes

Problèmes avec time.sleep et le multithreading en Python

J'ai un problème avec la fonction time.sleep() en python. Je fais tourner un script qui doit attendre qu'un autre programme génère des fichiers txt. Mais comme il s'agit d'une machine très ancienne, lorsque je mets en veille le script de 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() ? J'ai pensé que bloquer le thread pourrait fonctionner, mais il s'agirait essentiellement d'une boucle de blocage du thread pendant quelques secondes. Je vais donner ici un pseudo-code de ce que je fais.

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

7voto

detly Points 11267

Une façon d'effectuer une attente non bloquante est d'utiliser l'option threading.Event :

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

Il peut s'agir set() d'un autre fil pour indiquer que quelque chose s'est terminé. Mais si vous faites des choses dans un autre thread, vous pouvez éviter le timeout et l'événement et vous contenter de 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 un contrôle plus fin, je peux vous le montrer...

L'approche threading ne fonctionnera pas si votre plateforme ne fournit pas le module threading. Par exemple, si vous essayez de remplacer le module dummy_threading, dummy_event.wait() revient immédiatement. Il n'est pas certain que le join() l'approche.

Si vous attendez que d'autres processus se terminent, il est préférable de les gérer à partir de votre propre script en utilisant la commande sous-processus (et ensuite, par exemple, en utilisant le module wait pour s'assurer que le processus est terminé avant de poursuivre le travail).

Si vous ne pouvez pas gérer le sous-processus à partir de votre script, mais que vous connaissez le PID, vous pouvez utiliser la commande os.waitpid() fonction. Il faut se méfier de la OSError si le processus est déjà terminé au moment où vous utilisez cette fonction...

Si vous souhaitez un moyen multiplateforme de surveiller un répertoire pour être averti de la présence de nouveaux fichiers, je vous suggère d'utiliser un fichier de type Contrôleur de fichiers de l'OIG de PyGTK/PyGObject . Vous pouvez obtenir un moniteur sur un répertoire à l'aide de la fonction répertoire_moniteur d'un Fichier GIO .

Exemple de code rapide pour la surveillance d'un 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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X