Python Django TimeLimitExceeded错误
今天我收到一封芹菜发来的错误电子邮件,有人能解释一下吗?也许还有人能解释一下我如何解决超时问题?这会很有帮助的,谢谢 PS尽管有这个错误,我的信息还是发送了,对吗 错误:Python Django TimeLimitExceeded错误,python,django,django-celery,Python,Django,Django Celery,今天我收到一封芹菜发来的错误电子邮件,有人能解释一下吗?也许还有人能解释一下我如何解决超时问题?这会很有帮助的,谢谢 PS尽管有这个错误,我的信息还是发送了,对吗 错误: Task Request to Process with id 65123935-b190-4718-9ed0-fb863359f27f raised exception: 'TimeLimitExceeded(300.0,)' Task was called with args: (<Batch: Batch
Task Request to Process with id 65123935-b190-4718-9ed0-fb863359f27f
raised exception:
'TimeLimitExceeded(300.0,)'
Task was called with args: (<Batch: Batch object>,) kwargs: {}.
The contents of the full traceback was:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/billiard/pool.py", line 496, in on_hard_timeout
raise TimeLimitExceeded(job._timeout)
TimeLimitExceeded: TimeLimitExceeded(300.0,)
--
Just to let you know,
py-celery at w1.ip-10-32-53-113.
class ProcessRequests(Task):
name = "Request to Process"
max_retries = 1
default_retry_delay = 3
def run(self, batch):
# Only run this task on non-scheduled tasks
if batch.status != "Scheduled":
q = Contact.objects.filter(contact_owner=batch.user)
if batch.group == None:
q = q.filter(id=batch.contact_id)
else:
q = q.filter(group=batch.group)
for e in q:
msg = Message.objects.create(
recipient_number=e.mobile,
content=batch.content,
sender=e.contact_owner,
billee=batch.user,
sender_name=batch.sender_name
)
gateway = Gateway.objects.get(pk=2)
msg.send(gateway)
您可以尝试修改celeryd设置吗。文件应该主要是/etc/init.d/celeryd
CELERYD_OPTS="--time-limit==3600 -E --loglevel=DEBUG"
首先,当您收到关于任务函数/方法的消息时,您必须知道您实际在做什么,以及它的时间复杂性。如果您的任务需要超过默认的300秒才能完成,那么芹菜主进程将首先发送
SoftTimeLimitExceed
异常,如果我们将任务包含在try/except块中,您可以捕获该异常。此异常实际上适用于清理过程(如果有)。在这个异常之后,芹菜将向您发送另一个异常timelimitexeced
异常,它将杀死您的工作线程
如果您在芹菜设置上启用了延迟确认设置,则相同的消息将传递给另一个工作者进行处理(这是危险的,因为这也会失败)
因此,如果您遇到此异常,则这意味着您的任务需要超过300秒才能完成,因此请调整芹菜设置上工作人员的最大时间限制,以满足您的要求
问候,
Haridas N.您收到TimeLimitExceeded异常,因为您的任务执行时间超过300秒。300秒是任务可以运行的默认时间 正如Avichal Badaya所回答的,您可以配置芹菜以允许更长时间执行任务 您提到您的邮件仍被发送,但这可能会发生,因为您的任务是为批处理编写的。因此,要么你尝试发送多条消息,要么你只尝试发送一条消息,但有些消息会把批处理搞得一团糟
你能告诉我们你怎么称呼这个任务吗 您正在使用
msg.send(网关)
向手机发送消息,对吗
在这个方法中,您连接到远程webservice,它实际上发送消息,对吗
然后,您的消息可能已被发送,但在发送消息和请求响应后,您与远程方的连接尚未关闭,尽管webservice本应将其关闭
最后一件事-在创建用于连接webservice的套接字之前,您没有执行以下操作:
import socket
socket.setdefaulttimeout(seconds) # seconds argument is of type float
这样,您的任务将在套接字上挂起无限长的时间,等待webservice发送响应和/或关闭连接。事实上,如果不是芹菜超时,它将永远等待
如文档所述,默认套接字超时值为None
希望这有帮助。msg.send()在做什么?那是因为超时。默认时间限制为300秒,如果任务在这段时间后仍在运行,则会引发异常。与init.d文件相比,此处/etc/default/celeryd应用的配置更好。