Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django TimeLimitExceeded错误_Python_Django_Django Celery - Fatal编程技术网

Python Django TimeLimitExceeded错误

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

今天我收到一封芹菜发来的错误电子邮件,有人能解释一下吗?也许还有人能解释一下我如何解决超时问题?这会很有帮助的,谢谢

PS尽管有这个错误,我的信息还是发送了,对吗

错误:

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应用的配置更好。