2016-12-08 2 views
0

私はtornado.process.Subprocess(特にansible-playbook)で非トルネードプロセスを起動する竜巻アプリケーションを持っています。私はさまざまな段階でデータベースクエリを実行するansible-playbookにコールバックプラグインを持っています。プラグインから、私は竜巻のプロセスで使用しているのと同じtornado_mysqlライブラリを使用したいと思います。 db.py非トルネードpythonスクリプトからtornado_mysqlを使用するにはどうすればよいですか?

import db.py 
from tornado import ioloop 
io_loop = ioloop.IOLoop.instance() 
def playbook_on_play_start(self, play): 
    io_loop.run_sync(lambda: db.update_job_play(job_id, play)) 

callback_plugin.py:私は竜巻のrun_sync()方法でこれを行うことができた

def get_conn(): 
    return pools.Pool(
     connect_kwargs={ 
      'host': settings.get('mysql_host'), 
      'port': settings.get('mysql_port'), 
      'user': settings.get('mysql_username'), 
      'passwd': settings.get('mysql_password'), 
      'db': settings.get('mysql_database_name'), 
      'charset': 'utf8mb4', 
      'init_command': 'SET NAMES \'utf8mb4\'', 
      'cursorclass': DictCursor 
     }, 
     max_idle_connections=settings.get('mysql_max_idle_connections'), 
     max_open_connections=settings.get('mysql_open_connections') 
    ) 

@tornado.gen.coroutine 
def update_job_play(job_id, play): 
    sql = """ 
    UPDATE `job` 
    SET `current_play` = %(play)s 
    WHERE `id` = %(job_id)s 
    """ 
    yield get_conn().execute(sql, { 
     'job_id': job_id, 
     'play': play}) 

それが動作し、データベースが更新されますが、私はこれを取得しますエラー:

ERROR:tornado.application:Exception in callback None   
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/tornado/ioloop.py", line 882, in start 
     fd_obj, handler_func = self._handlers[fd] 
    KeyError: 13 
    ERROR:tornado.application:Exception in callback None 
    Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/tornado/ioloop.py", line 882, in start 
     fd_obj, handler_func = self._handlers[fd] 
    KeyError: 13 
    ERROR:tornado.application:Exception in callback None 

これが見つかりました:Tornado IOLoop Exception in callback None in Celery workerこれは関連しているようです。 ansible-playbookは、メインのtornadoアプリケーションとは別のプロセスですが、ansible_playbookは、接続先の各ホストに新しいスレッドをフォークします。

私の質問は、どうしたらそのエラーを取り除くことができますか?

答えて

0

IOLoopsスレッド間で共有することはできません。これは、プレイブックスレッドでIOLoop.instance()を呼び出して行います。代わりに、毎回新しいIOLoopを作成してください。

+0

これは正しく、ありがとうございました。 –

関連する問題