Celery 设置芹菜任务属性(即时间限制和软时间限制)无效
根据这个线程,问题已经解决了,但似乎还没有解决。 我目前的芹菜版本是3.1.18(Cipater) 我正在尝试覆盖任务的默认设置。目标是更改任务的软时限和硬时限,因为同一任务被用于多种目的 将软时间限制和时间限制传递给MyTask构造函数以更改默认设置Celery 设置芹菜任务属性(即时间限制和软时间限制)无效,celery,celery-task,Celery,Celery Task,根据这个线程,问题已经解决了,但似乎还没有解决。 我目前的芹菜版本是3.1.18(Cipater) 我正在尝试覆盖任务的默认设置。目标是更改任务的软时限和硬时限,因为同一任务被用于多种目的 将软时间限制和时间限制传递给MyTask构造函数以更改默认设置 ///celery/app/ task.py class MyTask(task.Task): time_limit = 100 soft_time_limit = 110 max_retries = 0 def
///celery/app/ task.py
class MyTask(task.Task):
time_limit = 100
soft_time_limit = 110
max_retries = 0
def __init__(self, time_limit=None, soft_time_limit=None,
max_retries=None, *args, **kwargs):
if time_limit:
self.time_limit = time_limit
if soft_time_limit:
self.soft_time_limit = soft_time_limit
if max_retries:
self.max_retries = max_retries
task.Task.__init__(self, *args, **kwargs)
t1 = MyTask(time_limit=30, soft_time_limit=20,
max_retries=5)
or
t1 = MyTask()
t1.time_limit = 30
t1.soft_time_limit = 20
然后将t1.si()传递给task.RetryableChain(…)
当worker调用run方法时,它仍然会收到旧值(time_limit=100),其中我已经设置了time_limit=30
请告诉我3.1.18版本中是否仍存在此问题。我必须修复芹菜代码才能使其正常工作。这绝对是一个临时修复,但它可以工作。我不确定属性何时设置为新值,以及为什么不将这些值传输到worker.job。我可以感觉到,当我们调用task.si或s()时,它会创建一个签名实例,该实例不包含这些时间限制属性,因此它从类中存储的原始值中获取。只是一个想法
t1 = MyTask()
kwargs = {}
kwargs['time_limit'] = 30
kwargs['soft_time_limit'] = 40
t.s(kwargs)
---->>>
/芹菜/worker/job.py
def execute_using_pool(self, pool, **kwargs):
"""Used by the worker to send this task to the pool.
:param pool: A :class:`celery.concurrency.base.TaskPool` instance.
:raises celery.exceptions.TaskRevokedError: if the task was revoked
and ignored.
"""
uuid = self.id
task = self.task
if self.revoked():
raise TaskRevokedError(uuid)
hostname = self.hostname
kwargs = self.kwargs
if task.accept_magic_kwargs:
kwargs = self.extend_with_default_kwargs()
request = self.request_dict
request.update({'hostname': hostname, 'is_eager': False,
'delivery_info': self.delivery_info,
'group': self.request_dict.get('taskset')})
timeout, soft_timeout = request.get('timelimit', (None, None))
# timeout = timeout or task.time_limit
# soft_timeout = soft_timeout or task.soft_time_limit
**# SKAR request.get(‘time limit’) always returns the original value stored in Task.
timeout = kwargs.get('time_limit', task.time_limit)
soft_timeout = kwargs.get('soft_time_limit', task.soft_time_limit)**
result = pool.apply_async(
trace_task_ret,
args=(self.name, uuid, self.args, kwargs, request),
accept_callback=self.on_accepted,
def execute_using_pool(self, pool, **kwargs):
"""Used by the worker to send this task to the pool.
:param pool: A :class:`celery.concurrency.base.TaskPool` instance.
:raises celery.exceptions.TaskRevokedError: if the task was revoked
and ignored.
"""
uuid = self.id
task = self.task
if self.revoked():
raise TaskRevokedError(uuid)
hostname = self.hostname
kwargs = self.kwargs
if task.accept_magic_kwargs:
kwargs = self.extend_with_default_kwargs()
request = self.request_dict
request.update({'hostname': hostname, 'is_eager': False,
'delivery_info': self.delivery_info,
'group': self.request_dict.get('taskset')})
timeout, soft_timeout = request.get('timelimit', (None, None))
# timeout = timeout or task.time_limit
# soft_timeout = soft_timeout or task.soft_time_limit
**# SKAR request.get(‘time limit’) always returns the original value stored in Task.
timeout = kwargs.get('time_limit', task.time_limit)
soft_timeout = kwargs.get('soft_time_limit', task.soft_time_limit)**
result = pool.apply_async(
trace_task_ret,
args=(self.name, uuid, self.args, kwargs, request),
accept_callback=self.on_accepted,