Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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 使用eventlet处理芹菜任务中的数据库问题_Python_Django_Celery_Eventlet - Fatal编程技术网

Python 使用eventlet处理芹菜任务中的数据库问题

Python 使用eventlet处理芹菜任务中的数据库问题,python,django,celery,eventlet,Python,Django,Celery,Eventlet,我在开发虚拟机“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 我使用supervisor和eventlet作为一名工人来运行一些服务和芹菜任务。这是主管配置的一部分: [program:celery-worker-default] command=/home/vagran

我在开发虚拟机“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

我使用supervisoreventlet作为一名工人来运行一些服务和芹菜任务。这是主管配置的一部分:

[program:celery-worker-default]
command=/home/vagrant/.virtualenvs/meridian/bin/python /vagrant/meridian/meridian/manage.py celery worker --loglevel=INFO -P eventlet -c 3 -Q default -E -n default.queue
directory=/vagrant/meridian/meridian
user=vagrant
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/celery-worker-default-stdout.log
stderr_logfile=/var/log/supervisor/celery-worker-default-stderr.log
priority=999
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=5
当任务正在运行时,它们会以以下堆栈跟踪失败:

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操作的任务都会失败

我曾尝试在任务体中使用选择\u for_update()with atomic():,但没有成功

我也在网上搜索了这个问题,但没有找到解决办法


有人知道如何解决这个问题吗?

找到类似于“装上芹菜”hook for芹菜的东西,并将以下代码放在那里:

import eventlet
eventlet.monkey_patch(MySQLdb=True)

它必须在任何Django代码之前执行。

找到类似于芹菜挂机的
,并将以下代码放在那里:

import eventlet
eventlet.monkey_patch(MySQLdb=True)

它必须在任何Django代码之前执行。

我找到了答案。问题是,我曾经在manage.py管理脚本下运行芹菜:

[program:celery-worker-default]
command=/home/vagrant/.virtualenvs/meridian/bin/python /vagrant/meridian/meridian/manage.py celery worker --loglevel=INFO -P eventlet -c 3 -Q default -E -n default.queue
我以这种方式改写了这一行:

[program:celery-worker-default]
command=bash -c "/vagrant/meridian/meridian/start_default_queue.sh"
这是start\u default\u queue.sh的内容:

source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
source /home/vagrant/.virtualenvs/meridian/bin/activate
workon meridian
exec celery worker --loglevel=INFO -P eventlet -c 3 -Q default -E -n default.queue

我不知道为什么,但直接运行芹菜工人解决了那个神秘的问题。

我找到了答案。问题是,我曾经在manage.py管理脚本下运行芹菜:

[program:celery-worker-default]
command=/home/vagrant/.virtualenvs/meridian/bin/python /vagrant/meridian/meridian/manage.py celery worker --loglevel=INFO -P eventlet -c 3 -Q default -E -n default.queue
我以这种方式改写了这一行:

[program:celery-worker-default]
command=bash -c "/vagrant/meridian/meridian/start_default_queue.sh"
这是start\u default\u queue.sh的内容:

source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
source /home/vagrant/.virtualenvs/meridian/bin/activate
workon meridian
exec celery worker --loglevel=INFO -P eventlet -c 3 -Q default -E -n default.queue

我不知道为什么,但是运行芹菜工人直接解决了这个神秘的问题。

你使用什么数据库?我使用mysql DB和python包mysqlcleint 1.3.9你使用什么数据库?我使用mysql DB和python包mysqlcleint 1.3.9我将这两行添加到我项目的manage.py中,但不幸的是没有成功。你知道我应该在哪里添加这两行吗?我也尝试过将这两行添加到配置文件中,但没有成功。试试这个或芹菜
app.on_init()
我将这两行添加到我的项目的manage.py中,但不幸的是没有成功。你知道我应该在哪里添加这些行吗?我也试着将其添加到配置文件中,但没有成功。试试这个或芹菜
app.on_init()