我有一个项目在dev-VM'ubuntu/trusty'下。 我将virtualenv与以下软件包一起使用:
celery 3.1.23
eventlet 0.18.4
django 1.8.15
mysqlclient 1.3.9
Python版本是3.4.3。 MySql版本是5.5。在
我使用主管和eventlet作为工作人员来运行一些服务和芹菜任务。这是主管配置的一部分:
^{pr2}$当任务正在运行时,它们将失败,并出现以下堆栈跟踪:
Traceback (most recent call last):
File "/home/vagrant/.virtualenvs/meridian/lib/python3.4/site-packages/celery/app/trace.py", line 231, in trace_task
loader_task_init(uuid, task)
File "/home/vagrant/.virtualenvs/meridian/lib/python3.4/site-packages/djcelery/loaders.py", line 114, in on_task_init
self.close_database()
File "/home/vagrant/.virtualenvs/meridian/lib/python3.4/site-packages/djcelery/loaders.py", line 85, in close_database
return self._close_database()
File "/home/vagrant/.virtualenvs/meridian/lib/python3.4/site-packages/djcelery/loaders.py", line 76, in _close_database
close()
File "/home/vagrant/.virtualenvs/meridian/lib/python3.4/site-packages/django/db/__init__.py", line 64, in close_old_connections
conn.close_if_unusable_or_obsolete()
File "/home/vagrant/.virtualenvs/meridian/lib/python3.4/site-packages/django/db/backends/base/base.py", line 403, in close_if_unusable_or_obsolete
self.close()
File "/home/vagrant/.virtualenvs/meridian/lib/python3.4/site-packages/django/db/backends/base/base.py", line 191, in close
self.validate_thread_sharing()
File "/home/vagrant/.virtualenvs/meridian/lib/python3.4/site-packages/django/db/backends/base/base.py", line 421, in validate_thread_sharing
% (self.alias, self._thread_ident, thread.get_ident()))
django.db.utils.DatabaseError: DatabaseWrapper objects created in a thread can only be used in that same thread. The object with alias 'default' was created in thread id 140089123953704 and this is thread id 140088751748512.
任何包含DB操作的任务都将失败。在
我尝试在任务体中使用select_for_update()和with atomic():,但没有成功。在
我也在网上搜索过这个问题,但没有找到解决办法。在
有人知道怎么解决这个问题吗?在
我找到了答案。问题是我以前在管理.py管理脚本:
我用这种方式改写了这句话:
^{pr2}$这是开始默认的内容_队列.sh:
我不知道为什么,但是运行芹菜工人直接解决了这个神秘的问题。在
找到类似于芹菜的
on_load
钩子,并将以下代码放在那里:它必须在任何Django代码之前执行。在
相关问题 更多 >
编程相关推荐