Tâches asynchrones avec Pool.apply_async()
En plus de map(), la classe multiprocessing.Pool() fournit une autre méthode pour exécuter des processus en parallèle appelée apply_async(). Cette méthode vous permet de soumettre un appel de fonction à un pool de processus et de continuer immédiatement l'exécution sans attendre le résultat. Au lieu de cela, vous pouvez utiliser une fonction de rappel pour récupérer le résultat de l'appel de fonction lorsque celui-ci est prêt.
Veuillez compléter slow_square.py.
import multiprocessing
import time
def slow_square(x):
time.sleep(1)
return x * x
def callback(result):
print(result)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
results = [pool.apply_async(slow_square, (x,), callback=callback) for x in range(10)]
for result in results:
result.wait()
print("All tasks completed.")
Dans cet exemple, nous définissons une fonction slow_square() qui prend un nombre x, attend une seconde, puis renvoie le carré de x. Nous définissons également une fonction de rappel callback() qui imprime simplement le résultat lorsqu'il est disponible.
Nous créons ensuite un pool de quatre processus et utilisons apply_async() pour soumettre un appel de fonction au pool pour chaque nombre compris dans la plage de 0 à 9. Nous passons la fonction slow_square() et l'argument x à l'aide du paramètre args, et spécifions également la fonction de rappel à appeler lorsque le résultat est prêt.
Nous parcourons ensuite la liste des résultats et appelons result.wait() pour bloquer le fil principal jusqu'à ce que le résultat soit prêt. Enfin, nous imprimons un message pour indiquer que toutes les tâches sont terminées.