Obtenir task_id à l'intérieur d'une tâche de Céleri
C'est probablement une question stupide, mais sa m'a déconcerté à venir à partir d'un Rubis de fond.
J'ai un objet qui ressemble à ça quand j'ai essayer de l'imprimer.
print celery.AsyncResult.task_id
>>><property object at 0x10c383838>
Je m'attendais à la valeur réelle de la task_id propriété à imprimer ici. Comment puis-je obtenir la valeur réelle?
Mise à JOUR de 1
@celery.task
def scan(host):
print celery.AsyncResult.task_id
cmd = 'ps -ef'
cm = shlex.split(cmd)
scan = subprocess.check_output(cm)
return scan
Meilleures Salutations.
Créer une instance de la classe.
en fait, vous devez poster cela comme une réponse 🙂
À partir de la lettre-enveloppe et de sortie on dirait
property
s sont descripteurs qui sont utilisés pour fournir de l'attribut comme l'accès à des getter/setter, mais ils fonctionnent au niveau de l'instance. Lors de l'accès de la classe que vous obtenez simplement l' property
wrapper.en fait, vous devez poster cela comme une réponse 🙂
À partir de la lettre-enveloppe et de sortie on dirait
celery.AsyncResult
doit être le nom d'une classe, et non une instance de l'une, et task_id
est un attribut de propriété de cette classe, qui est ce que Bakuriu dit je crois.OriginalL'auteur user1513388 | 2013-09-18
Vous devez vous connecter pour publier un commentaire.
Histoire courte, au sein de la fonction
scan
, utilisezscan.request.id
.Voir http://docs.celeryproject.org/en/latest/userguide/tasks.html?highlight=request#task-request-info
Quelle est la version de Céleri utilisez-vous? Pour une version plus ancienne (je pense qu'avant 2.2), il y a une manière différente de le faire à l'aide de paramètres de mot clé.
Je suis en utilisant 3.0.23 (Chiastique Diapositive)
Hmm - eh Bien, je suis soufflé! Il travaille maintenant! Merci Chris! Aussi simple que d'analyse.demande.id
Pour moi, à l'aide de
celery.current_task.request.id
à l'intérieur de la tâche travailléOriginalL'auteur Chris Johnson
Vous accédez à la
propriété
de la classe, alors quetask_id
est une propriété de instances deAsynchResult
.Pour obtenir la valeur de
task_id
vous devez d'abord créer une instance de cette classe, par la suite accéder àasynch_result_instance.task_id
va vous retourner le real id.Dans votre code mis à jour:
Ici, vous accédez à la classe comme je l'ai déjà expliqué. Ce que vous voulez est une instance de la cours d'exécution de la tâche. Vous pouvez utiliser
de céleri.current_task
pour obtenir en cours d'exécution de la tâche de l'objet:Ou, si vous êtes intéressé par l'identifiant unique d'utiliser la
demande
attribut de l'décoré de la fonction:Dans ce deuxième cas, ne pas utiliser toute variable locale appelée
scan
sinon, vous aurez unUnboundLocalError
.(Code non testé car je n'ai pas
celery
installé.)La
property
s sont les descripteurs de utilisé pour fournir de l'attribut comme l'accès à des getter/setter, de sorte que vous pouvez accéder à des données comme:Mais lorsque le code est exécuté le setter ou getter peut contrôler ce qui se passe.
Vous pouvez le vérifier avec un mannequin de classe:
OriginalL'auteur Bakuriu
Afin de rendre vos tâches plus "OO-like", vous pouvez utiliser le
bind
argument pour obtenir une référence àself
:Veuillez noter que
self.request.id
est en fait une instance deAsyncTask
. Afin d'avoir l'id de tâche comme un chaîne, vous devriez faireself.request.id.__str__()
.De Le céleri à la documentation de (d'après l'exemple):
OriginalL'auteur Victor