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的請求調用。