J'ai le code suivant :
def getdata3(self, page, data, apifolder, additional):
tries = 10
for n in range(tries):
try:
except (ChunkedEncodingError, requests.exceptions.HTTPError) as e:
...
if n == tries - 1:
raise e # Si arrivé ici - Terminer !
print ("{2} page {0} finished. Length is {1}".format(page,len(datarALL),str(datetime.now())))
return job
Code principal :
with ThreadPoolExecutor(max_workers=num_of_workers) as executor:
futh = [(executor.submit(self.getdata3, page, data, apifolder,additional)) for page in pages]
for data in as_completed(futh):
datarALL.extend(data.result())
print ("Finished generateing data.")
return datarALL
Ce code crée des threads pour les travailleurs. Lorsque tout le travail est terminé, il retourne le datarALL
.
Mon problème :
Ce que je veux, c'est que si l'un des threads arrive ici :
if n == tries - 1:
raise e # Si arrivé ici - Terminer !
Tous les threads existants seront terminés. Aucun nouveau thread ne sera créé (terminer la boucle for page in pages
) et le programme entier sera terminé.
J'ai lu quelques articles sur le problème. J'ai également lu cette Devrais-je utiliser des événements, des sémaphores, des verrous, des conditions ou une combinaison de ceux-ci pour gérer la sortie en toute sécurité de mon programme Python multithreadé ? mais les solutions proposées sont très complexes et semblent ajouter beaucoup de code dont je doute avoir besoin.
J'ai essayé de faire :
if n == tries - 1:
exit(1)
Mais lorsque je vérifie htop
, cela ne ferme pas l'ensemble du processus et des threads... J'en ai quelques-uns qui restent là comme des zombies.
Ma question : Y a-t-il une solution simple et propre pour terminer le programme avec un message d'erreur ?