Question Arrêter le code après la période [dupliquer]


Cette question a déjà une réponse ici:

Je voudrais appeler foo(n) mais arrêtez-le s'il dure plus de 10 secondes. Quel est le bon moyen de faire cela?

Je peux voir que je pourrais en théorie modifier foo elle-même vérifier périodiquement depuis combien de temps elle a couru, mais je préférerais ne pas le faire.


21
2018-02-17 11:03


origine


Réponses:


Voici:

import multiprocessing
import time

# Your foo function
def foo(n):
    for i in range(10000 * n):
        print "Tick"
        time.sleep(1)

if __name__ == '__main__':
    # Start foo as a process
    p = multiprocessing.Process(target=foo, name="Foo", args=(10,))
    p.start()

    # Wait 10 seconds for foo
    time.sleep(10)

    # Terminate foo
    p.terminate()

    # Cleanup
    p.join()

Cela attend 10 secondes pour foo et ensuite le tuer.

Mettre à jour

Terminez le processus uniquement s'il est en cours d'exécution.

# If thread is active
if p.is_alive():
    print "foo is running... let's kill it..."

    # Terminate foo
    p.terminate()

Mise à jour 2: recommandée

Utilisation join avec timeout. Si foo se termine avant la temporisation, puis main peut continuer.

# Wait a maximum of 10 seconds for foo
# Usage: join([timeout in seconds])
p.join(10)

# If thread is active
if p.is_alive():
    print "foo is running... let's kill it..."

    # Terminate foo
    p.terminate()
    p.join()

27
2018-02-17 12:01



import signal

#Sets an handler function, you can comment it if you don't need it.
signal.signal(signal.SIGALRM,handler_function) 

#Sets an alarm in 10 seconds
#If uncaught will terminate your process.
signal.alarm(10) 

Le délai d'attente n'est pas très précis, mais peut être fait si vous n'avez pas besoin d'une extrême précision.

Une autre façon est d'utiliser le Ressource module, et définir le temps CPU maximum.


2
2018-02-17 20:57