python continuer si processus ne répond pas au bout de 30 seconde

a marqué ce sujet comme résolu.

Bonjour, j’ai une question avec le multiprocessing, c’est pour un programme qui ferais du réseau. J’aimerais que mon applie qui est multicœur laisse tomber son process si il n’a pas répondu a temps, au bout de 30 seconde par exemple.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import multiprocessing
import time

# Your foo function
def foo(n):
    time.sleep(n)
    print(1/n)


if __name__ == '__main__':
    p1 = multiprocessing.Process(target=foo, name="Foo", args=(3,))
    p1.start()

    p2 = multiprocessing.Process(target=foo, name="Foo", args=(60,))
    p2.start()

    p1.join()
    p2.join()

    print("\n program finish")

voici un exemple pour expliquer mon problème, je voudrais que au bout de 30 seconde si p1 ou p2 n’a pas fini on les kill et on m’affiche "program finish"

Plusieurs solutions :

  1. D’après la doc de multiprocessing, la signature est join([timeout]), donc… tu peux utiliser le timeout ! (bien pour un process, la tu vas attendre plus, dépend si tu veux 30 sec entre les deux join)
  2. Tu fais un timer qui te kill ton process au timeout.
  3. Tu regardes du côté de multiprocessing.Pool (il y a des tonnes de sujets si tu cherches python multiprocessing pool timeout)

Bonne journée !

Bonjour, j’ai essayé le timeout mais cela ne marche pas… Python quitte bien mon thread mais il continue quand même d’exécuter mon sleep(10) moi je voudrais le killer une fois executer le worker.join(5)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import queue
from threading import Thread
import time

def do_stuff(q):
    time.sleep(10)
    q.put(5)


def data():
    q = queue.Queue()
    worker = Thread(target=do_stuff, args=(q,))
    worker.start()
    worker.join(5)

    if q.qsize()==0:
        return -1
    else:
        return q.get()

result=data()
print("finish "+ str(result))

Python quitte bien mon thread

jipete

Non. Le timeout est fait au niveau du join, pas du thread.

C’est l’attente du join qui se termine parce que le timeout est atteint, le thread continue de tourner.

Tuer un thread n’est pas une opération courante ni facile en Python, et pas souvent recommandée. Mais dans le cas de multiprocessing (sur quoi portait la question initiale), tu as une méthode terminate sur les objets Process, qui fonctionnera pour peu que ton sous-processus n’attrape pas le signal SIGTERM.

Un exemple d’appel à join puis à terminate ? Oui, si tu veux.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import multiprocessing
import time

def target():
    time.sleep(10)
    print('finished')

p = multiprocessing.Process(target=target)
p.start()
p.join(5)
p.terminate()
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte