在执行信号功能期间如何访问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
之前被删除。我能坚持谁的存在?
谢谢。