Вы получаете доступ к property
из класса, в то время как task_id
это свойство экземпляров из AsynchResult
.
Для получения значения task_id
вам сначала нужно создать экземпляр этого класса, после чего доступ к asynch_result_instance.task_id
вернет вам реальный идентификатор.
В обновленной код:
@celery.task
def scan(host):
print celery.AsyncResult.task_id
# ...
Здесь вы обращаетесь к классу, как я уже объяснил. То, что вы хотите, является экземпляром выполняемой в настоящее время задачи. Вы можете использовать celery.current_task
, чтобы получить исполняемую в данный момент задачи-объект:
@celery.task
def scan(host):
print celery.current_task.task_id
Или, если вы заинтересованы в уникальный идентификатор используется атрибут request
украшенного функции:
@celery.task
def scan(host):
print scan.request.id
cmd = 'ps -ef'
cm = shlex.split(cmd)
# IMPORTANT: Do *not* use "scan = ..."!
result = subprocess.check_output(cm)
return result
В этом втором случае do не использовать любую локальную переменную под названием scan
, иначе вы будете UnboundLocalError
.
(код не проверял, так как я не celery
установлен.)
В property
s являются descriptors используются для обеспечения атрибутах, как доступ к методам геттер/сеттер, так что вы можете получить доступ к данным, как :
instance.attribute
instance.attribute = value
Но когда код выполнен, сеттер или геттер могут контролировать, что происходит.
Вы можете проверить это с помощью манекена класса:
>>> class Dummy(object):
... @property
... def a(self):
... print("called the getter!")
... return 1
...
>>> Dummy.a
<property object at 0x7fdae86978e8>
>>> Dummy().a
called the getter!
1
Создать экземпляр класса. 'property' являются [дескрипторами] (http://docs.python.org/2/reference/datamodel.html#implementing-descriptors), которые используются для предоставления атрибутного доступа к методам getter/setter, но они работают на уровень экземпляра. При доступе к ним из класса вы просто получаете оболочку 'property'. – Bakuriu
@Bakuriu вы должны на самом деле опубликовать это как ответ :) – alecxe
Из окна с буквой и вывода это выглядит как 'celery.AsyncResult' должно быть именем класса, а не экземпляром одного, а' task_id' является свойством атрибут этого класса - вот что говорит Бакуриу, я верю. – martineau