撤销信号后如何访问Celery任务属性?

时间:2019-01-30 12:43:04

标签: python celery

在执行信号功能期间如何访问Celery任务属性?

最小化安装以解决问题,redis和Rabbitmq分别作为localhost的后端和代理运行,

import time
import celery
from celery import Celery
from celery.signals import task_revoked

app = Celery('app', broker='pyamqp://guest@localhost//', backend='redis://localhost')

class BaseTask(celery.Task):
    def init_counter(self):
        self.counter = 0

@app.task(name='test', bind=True, base=BaseTask)
def test(self):
    self.init_counter()
    while self.counter < 20:
        print(str(self.counter))
        time.sleep(1)
        self.counter += 1

@task_revoked.connect(weak=False)
def on_task_revoked(signal, sender, *args, **kwargs):
    print('task_revoked')
    print('COUNTER', sender.counter)

我开始使用芹菜工人

celery -A app worker --loglevel=info

我使用来启动和撤消芹菜任务

import time

from celery.task.control import revoke
from app import test

task_id = test.delay().id
time.sleep(3)
revoke(task_id, terminate=True)

错误消息是

[2019-01-30 13:36:05,058: INFO/MainProcess] Terminating 764f351e-4556-4b61-90da-3d61feb23fc7 (Signals.SIGTERM)
[2019-01-30 13:36:05,065: WARNING/MainProcess] task_revoked
[2019-01-30 13:36:05,065: ERROR/MainProcess] Signal handler <function on_task_revoked at 0x7f7ee0428378> raised: AttributeError("'test' object has no attribute 'counter'",)
Traceback (most recent call last):
  File "/home/mjanvier/anaconda3/lib/python3.6/site-packages/celery/utils/dispatch/signal.py", line 288, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/home/mjanvier/Documents/TESTS/celery-revoked/app.py", line 24, in on_task_revoked
    print('COUNTER', sender.counter)
AttributeError: 'test' object has no attribute 'counter'
[2019-01-30 13:36:05,090: WARNING/MainProcess] task_revoked
[2019-01-30 13:36:05,090: ERROR/MainProcess] Signal handler <function on_task_revoked at 0x7f7ee0428378> raised: AttributeError("'test' object has no attribute 'counter'",)
Traceback (most recent call last):
  File "/home/mjanvier/anaconda3/lib/python3.6/site-packages/billiard/pool.py", line 1725, in _set_terminated
    raise Terminated(-(signum or 0))
billiard.exceptions.Terminated: 15

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mjanvier/anaconda3/lib/python3.6/site-packages/celery/utils/dispatch/signal.py", line 288, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/home/mjanvier/Documents/TESTS/celery-revoked/app.py", line 24, in on_task_revoked
    print('COUNTER', sender.counter)
AttributeError: 'test' object has no attribute 'counter'
[2019-01-30 13:36:05,091: ERROR/MainProcess] Task handler raised error: Terminated(15,)
Traceback (most recent call last):
  File "/home/mjanvier/anaconda3/lib/python3.6/site-packages/billiard/pool.py", line 1725, in _set_terminated
    raise Terminated(-(signum or 0))
billiard.exceptions.Terminated: 15

我想访问counter属性,该属性在执行on_task_revoked之前被删除。我能坚持谁的存在?

谢谢。

0 个答案:

没有答案