python tornado

安装:

??mysql

tornado 多进程 数据同步

tornado mysql

Tornado 标榜的是 asynchronous 和 non-blocking,然而,不少时候一不当心一不讲究就会把整个 tornado 阻塞住,特别是作 MySQL 操做时。本文简述两种在 tornado 中异步无阻塞地使用 MySQL 的方法。web

常见的阻塞状况sql

class Handler(tornado.web.RequestHandler):
    def get(self):
        connection = pymysql.connect()        # 链接数据库的相关参数省略
 
        with connection.cursor() as cursor:
            sql = '这里应该有一条SQL查询语句'
            cursor.execute(sql)
            result = cursor.fetchone()
 
        self.write(str(result['id']))

以上这种情景,tornado 会在 pymysql.connect() 和 cursor.execute(sql) 的地方阻塞住,没法响应其余 request。数据库

无阻塞方案1:使用 Tornado-MySQL 做者不维护,不用为好。app

无阻塞方案2:使用 Celery异步

Celery 是一个异步的任务队列,它能很方便地支持分布式扩展,于是很适合将 tornado 中的长时间的阻塞工做交由 Celery 来完成。 而要 Celery 配合 Tornado 一块儿工做,须要借助一个名为 tornado-celery 请戳 pypi 页面的包。async

看例子,首先是 tornado handler 的代码:分布式

import tornado.gen
import tornado.web
import tcelery
 
import mysql_task
 
tcelery.setup_nonblocking_producer()
 
class Handler(tornado.web.RequestHandler):
 
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        result = yield tornado.gen.Task(mysql_task.mysql_test.apply_async)
 
        self.write(result)
        self.finish()

而具体操做 MySQL 的部分则摆在 mysql_task.py 文件中。至于 celery worker 的写法这里就省略掉了。tornado

特别须要注意的是:tornado-celery 目前只支持 AMQP 的 backend。fetch

相关文章
相关标签/搜索