我在Celery任务中使用Scrapy解析函数(有时可能要花10分钟)时才得到此消息。

我用:
-Django == 1.6.5
-django-celery == 3.1.16
- celery == 3.1.16
-psycopg2 == 2.5.5(我也使用过psycopg2 == 2.5.4)

[2015-07-19 11:27:49,488:CRITICAL / MainProcess]任务myapp.parse_items [63fc40eb-c0d6-46f4-a64e-acce8301d29a]内部错误:InterfaceError(“连接已关闭”,)
追溯(最近一次通话):
在trace_task中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/celery/app/trace.py”,第284行
uuid,retval,SUCCESS,request = task_request,
在store_result中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/celery/backends/base.py”,第248行
request = request,** kwargs)
_store_result中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/djcelery/backends/database.py”,第29行
traceback =回溯,children = self.current_task_children(request),
_inner中第42行的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/djcelery/managers.py”
返回乐趣(* args,** kwargs)
在store_result中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/djcelery/managers.py”,第181行
'meta':{'children':children}})
在update_or_create中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/djcelery/managers.py”,第87行
返回get_queryset(self).update_or_create(** kwargs)
在update_or_create中的第70行,输入文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/djcelery/managers.py”
obj,创建= self.get_or_create(** kwargs)
在get_or_create中的第376行,文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/models/query.py”
返回self.get(** lookup),False
在get中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/models/query.py”
num = len(克隆)
__len__中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/models/query.py”,第77行
self._fetch_all()
_fetch_all中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/models/query.py”,行857
self._result_cache =列表(self.iterator())
在迭代器中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/models/query.py”,第220行
对于compile.results_iter()中的行:
在results_iter中,文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py”,第713行
对于self.execute_sql(MULTI)中的行:
在execute_sql的第785行中,文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py”
光标= self.connection.cursor()
在游标中的第160行“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/backends/__init__.py”
光标= self.make_debug_cursor(self._cursor())
_cursor中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/backends/__init__.py”,第134行
返回self.create_cursor()
__exit__中的第99行的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/utils.py”
6.reraise(dj_exc_type,dj_exc_value,回溯)
_cursor中的文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/backends/__init__.py”,第134行
返回self.create_cursor()
在create_cursor的第137行中,文件“/home/mo/Work/python/pb-env/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py”
光标= self.connection.cursor()
InterfaceError:连接已关闭

最佳答案



编辑:

找到了更好的解决方案。我实现了一个celery任务基类,如下所示:

from django.db import connection
import celery

class FaultTolerantTask(celery.Task):
    """ Implements after return hook to close the invalid connection.
    This way, django is forced to serve a new connection for the next
    task.
    """
    abstract = True

    def after_return(self, *args, **kwargs):
        connection.close()

@celery.task(base=FaultTolerantTask)
def my_task():
    # my database dependent code here

我相信它也会解决您的问题。

关于python - InterfaceError:连接已关闭(使用django + celery + Scrapy),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31504591/

10-09 14:23