2016-10-23 2 views
1

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スーパーバイザを使用しています。これは、スーパーバイザの設定の一部です:

[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操作を含むすべてのタスク。

I)は、(原子でselect_for_update()を使用しようとしました:タスク体中が、任意の成功なし。

また、ネットでその問題について検索しましたが、解決策が見つかりませんでした。

これを解決する方法は誰か分かりますか?

+1

どのDBを使用しますか? –

+0

私はmysql dbとpythonパッケージmysqlcleintを使います。1.3.9 –

答えて

0

私は答えを見つけました。問題は、私はmanage.py経営管理論スクリプトの下にセロリを実行するために使用されるということでした。

[program:celery-worker-default] 
command=bash -c "/vagrant/meridian/meridian/start_default_queue.sh" 

そしてstart_default_queueのこのコンテンツ:私はこのようにその行を書き換えている

[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 

。 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 

私はなぜ知っているが、セロリworkeを実行していませんrは、その神秘的な問題を直接修正しました。

0

はセロリのためon_loadフックのようなものを見つけて、そこに次のコードを置く:

import eventlet 
eventlet.monkey_patch(MySQLdb=True) 

それは任意のDjangoのコードの前に実行する必要があります。

+0

私はこの2行を私のプロジェクトの** manage.py **に追加しましたが、残念なことに成功しません。私はこれらの行を追加する必要があります任意のアイデア? –

+0

また、これを構成ファイルに追加しようとしましたが、動作しませんでした。 –

+1

試すhttp://stackoverflow.com/a/16111968/73957 https://docs.djangoproject.com/en/dev/ref/applications/#django.apps.AppConfig.ready またはCelery 'app.on_init () 'http://docs.celeryproject.org/ja/latest/userguide/application.html#laziness – temoto

関連する問題