J'ai un pool multiprocesseur Python qui effectue un travail très long et qui, même après un débogage approfondi, n'est pas assez robuste pour ne pas tomber en panne toutes les 24 heures environ, car il dépend de nombreux outils tiers non Python aux interactions complexes. En outre, la machine sous-jacente présente certains problèmes que je ne peux pas contrôler. Notez que par défaillance, je ne veux pas dire que le programme entier se plante, mais que certains ou la plupart des processus deviennent inactifs à cause de certaines erreurs, et que l'application elle-même se suspend ou continue le travail avec les processus qui n'ont pas échoué.
Pour l'instant, ma solution consiste à arrêter périodiquement le travail, manuellement, puis à le redémarrer à partir de là où il était.
Même si ce n'est pas idéal, ce que je veux faire maintenant est le suivant : redémarrer le pool de multiprocesseurs périodiquement, par programme, à partir du code Python lui-même. Je ne me soucie pas vraiment si cela implique de tuer les travailleurs du pool au milieu de leur travail. Quelle serait la meilleure façon de le faire ?
Mon code ressemble à ça :
with Pool() as p:
for _ in p.imap_unordered(function, data):
save_checkpoint()
log()
Ce que j'ai en tête serait quelque chose comme :
start = 0
end = 1000 # magic number
while start + 1 < len(data):
current_data = data[start:end]
with Pool() as p:
for _ in p.imap_unordered(function, current_data):
save_checkpoint()
log()
start += 1
end += 1
Ou :
start = 0
end = 1000 # magic number
while start + 1 < len(data):
current_data = data[start:end]
start_timeout(time=TIMEOUT) # which would be the best way to to do that without breaking multiprocessing?
try:
with Pool() as p:
for _ in p.imap_unordered(function, current_data):
save_checkpoint()
log()
start += 1
end += 1
except Timeout:
pass
Ou toute autre suggestion que vous pensez être meilleure. Toute aide serait très appréciée, merci !