web-dev-qa-db-fra.com

Parallel Python: Qu'est-ce qu'un rappel?

Dans Parallel Python il a quelque chose dans le soumettre fonction appelée callback ( documentation ) mais cela ne semble pas trop l'expliquer. J'ai posté sur leur forum il y a quelques jours et je n'ai pas reçu de réponse. Quelqu'un pourrait-il expliquer ce qu'est un rappel et à quoi il sert?

Je vous remercie.

41
Nope

Un rappel est une fonction fournie par le consommateur d'une API que l'API peut ensuite retourner et invoquer (vous rappeler). Si je prends rendez-vous avec un Dr, je peux leur donner mon numéro de téléphone, afin qu'ils puissent m'appeler la veille pour confirmer le rendez-vous. Un rappel est comme ça, sauf qu'au lieu d'être simplement un numéro de téléphone, il peut s'agir d'instructions arbitraires comme "envoyez-moi un e-mail à cette adresse, et appelez également ma secrétaire et demandez-lui de le mettre dans mon calendrier.

Les rappels sont souvent utilisés dans des situations où une action est asynchrone. Si vous avez besoin d'appeler une fonction et de continuer immédiatement à travailler, vous ne pouvez pas rester là à attendre sa valeur de retour pour vous informer de ce qui s'est passé, vous fournissez donc un rappel. Lorsque la fonction aura complètement terminé son travail asynchrone, elle appellera alors votre rappel avec des arguments prédéterminés (généralement certains que vous fournissez, et certains sur l'état et le résultat de l'action asynchrone que vous avez demandée).

Si le Dr est absent du bureau, ou s'il travaille toujours à l'horaire, plutôt que de me faire attendre jusqu'à ce qu'il revienne, ce qui pourrait prendre plusieurs heures, nous raccrochons, et une fois le rendez-vous fixé, ils appelle-moi.

Dans ce cas spécifique, la fonction de soumission de Parallel Python invoquera votre rappel avec tous les arguments que vous fournissez et le résultat de func, une fois que func aura terminé son exécution.

159
Logan Capaldo

L'endroit pertinent dans les documents:

callback - callback function which will be called with argument 
        list equal to callbackargs+(result,) 
        as soon as calculation is done
callbackargs - additional arguments for callback function

Donc, si vous voulez que du code soit exécuté dès que le résultat est prêt, vous mettez ce code dans une fonction et passez cette fonction comme argument callback. Si vous n'avez pas besoin d'autres arguments, ce sera juste, par exemple:

def itsdone(result):
  print "Done! result=%r" % (result,)
...
submit(..., callback=itsdone)

Pour plus d'informations sur le modèle callback en Python, voir par ex. ma présentation ici .

18
Alex Martelli

En regardant le lien, on dirait juste un crochet qui s'appelle.

callback - fonction de rappel qui sera appelée avec une liste d'arguments égale à callbackargs + (résultat,) dès que le calcul est terminé

Le bit "dès que le calcul est fait" semble ambigu. Le point, pour autant que je puisse voir de cette chose est que l'appel submit() distribue le travail à d'autres serveurs, puis revient. Parce que la finition est asynchrone, plutôt en bloc, elle vous permet de fournir une fonction qui est appelée quand une unité de travail se termine. Si tu fais:

submit( ..., callback=work_finished, ... )

Ensuite, submit garantira que work_finished() est appelée lorsque l'unité de travail distribué est terminée sur le serveur cible.

Lorsque vous appelez submit() vous pouvez fournir un callback qui est appelé dans le même runtime que l'appelant de submit() ... et il est appelé après la distribution de la fonction de charge de travail est terminée.

Un peu comme "appeler foo (x, y) quand vous avez fait des trucs dans submit ()"

Mais oui, la documentation pourrait être meilleure. Ayez un ganders à la source ppython et voyez à quel moment le rappel est appelé dans submit()

4
Aiden Bell

Un rappel est une fonction que vous définissez qui sera appelée plus tard par une fonction que vous appelez.

Par exemple, considérez comment AJAX fonctionne: vous écrivez du code qui appelle une fonction de serveur principal. À un certain moment dans le futur, il reviendra de cette fonction (le "A" signifie Asynchrone). , c'est à cela que sert le "Parallel" dans "Parallel Python".) Maintenant - parce que votre code appelle le code sur le serveur, vous voulez qu'il vous dise quand il est fait, et vous voulez faire quelque chose avec ses résultats. Il le fait en appelant votre fonction de rappel .

Lorsque la fonction appelée se termine, la façon standard pour elle de vous dire que c'est fait est de lui dire d'appeler une fonction dans votre code. C'est la fonction de rappel, et son travail consiste à gérer les résultats/sorties de la fonction de niveau inférieur que vous avez appelée.

3
Jeremy Smyth

Un rappel est simplement une fonction. En Python, les fonctions sont juste plus d'objets, et donc le nom d'une fonction peut être utilisé comme variable, comme ceci:

def func():
    ...

something(func)

Notez que de nombreuses fonctions qui acceptent un rappel comme argument nécessitent généralement que le rappel accepte certains arguments. Dans ce cas, la fonction de rappel devra accepter une liste d'arguments spécifiés dans callbackargs. Je ne connais pas Parallel Python donc je ne sais pas exactement ce qu'il veut.

1
marsolk