tornado中使用celery實現異步MySQL操做

tornado-celery 是基於celery的tornado客戶端,經過tornado-celery能夠將耗時任務加入到任務隊列中處理,在celery中建立任務,tornado中就能夠像調用AsyncHttpClient同樣調用這些任務。python

使用celery須要選擇一種broker(中間人)進行消息的接受和發送,中間人一般做爲一種獨立的服務,經常使用的broker又RabbitMQ、Redis以及MongoDB等。git

RabbitMQ 是AMPQ高級消息隊列協議的實現,是使用最普遍的消息系統,由於tornado-celery中使用redis沒法使用callback,建議使用RabbitMQ做爲broker。github

下面是準備工做redis

  • 安裝tornado、celery、tornado-celery數據庫

  • 安裝RabbitMQ
    mac上使用brew安裝該服務程序app

    brew install rabbitmq
  • 啓動rabbitmq-server異步

    sudo rabbitmq-server -detached

準備工做完成後就能夠編碼了async

  • 建立tasks.pytornado

    celery = Celery('tasks', broker='amqp://')
    celery.conf.CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'amqp')
    
    @celery.task(name='task.query_users')
    def query_users(admin_id):
        # 耗時的數據庫操做
        return db.query_all_users(admin_id)
  •  運行tasks.py編碼

    python tasks.py worker --loglevel=info
  • 建立handler

import tcelery
    tcelery.setup_nonblocking_producer()

    from tasks import query_users
    
    calss Users(RequestHandler):
        @asynchronous
        def get():
            # 參數經過args的list傳遞,回調經過callback指定
            query_users.apply_async(args=[admin_id], callback=self.on_success)
        def on_success(self, response):
            # 獲取返回的結果
            users = response.result
            self.write(users)
            self.finish()

這樣,query_users的請求就變成異步非阻塞的了,同理,其餘的耗時操做能夠放到task中供tornado的請求調用。

相關文章
相關標籤/搜索