momoko tornado 连接池 异步
2012-12-08 23:49
232 查看
import tornado.ioloop
import tornado.web
import momoko
from tornado import gen
class BaseHandler(tornado.web.RequestHandler):
@property
def db(self):
# Create a database connection when a request handler is called
# and store the connection in the application object.
if not hasattr(self.application,
'db'):
self.application.db = momoko.AsyncClient({
'host':
'',
'database':
'',
'user':
'',
'password':
'',
'min_conn':
1,
'max_conn':
20,
'cleanup_timeout':
10
})
return self.application.db
class SingleQueryHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
# One simple query
cursor = yield gen.Task(self.db.execute,
'SELECT 42, 12, %s, 11;', (25,))
self.write('Query results: %s' % cursor.fetchall())
self.finish()
class LSingleQueryHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
# One simple query
cursor = yield gen.Task(self.db.execute,
'select count(*) from asd a,asd b,asd
c')
self.write('Query results: %s' % cursor.fetchall())
self.finish()
class BatchQueryHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
# These queries are executed all at once and therefore they need to be
# stored in an dictionary so you know where the resulting cursors
# come from, because they won't arrive in the same order.
cursors = yield gen.Task(self.db.batch, {
'query1': ['SELECT 42, 12, %s, %s;', (23,
56)],
'query2':
'SELECT 1, 2, 3, 4, 5;',
'query3':
'SELECT 465767, 4567, 3454;'
})
for key, cursor
in cursors.items():
self.write('Query results: %s = %s<br>' % (key, cursor.fetchall()))
self.finish()
class QueryChainHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
# Execute a list of queries in the order you specified
cursors = yield gen.Task(self.db.chain, (
['SELECT 42, 12, %s, 11;', (23,)],
'SELECT 1, 2, 3, 4, 5;'
))
for cursor
in cursors:
self.write('Query results: %s<br>' % cursor.fetchall())
self.finish()
class MultiQueryHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
cursor1, cursor2, cursor3 = yield [
gen.Task(self.db.execute, 'SELECT 42, 12, %s, 11;', (25,)),
gen.Task(self.db.execute, 'SELECT 42, 12, %s, %s;', (23,
56)),
gen.Task(self.db.execute, 'SELECT 465767, 4567, 3454;')
]
self.write('Query 1 results: %s<br>' % cursor1.fetchall())
self.write('Query 2 results: %s<br>' % cursor2.fetchall())
self.write('Query 3 results: %s' % cursor3.fetchall())
self.finish()
class CallbackWaitHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
self.db.execute('SELECT 42, 12, %s, 11;', (25,),
callback=(yield gen.Callback('q1')))
self.db.execute('SELECT 42, 12, %s, %s;', (23,
56),
callback=(yield gen.Callback('q2')))
self.db.execute('SELECT 465767, 4567, 3454;',
callback=(yield gen.Callback('q3')))
cursor1 = yield gen.Wait('q1')
cursor2 = yield gen.Wait('q2')
cursor3 = yield gen.Wait('q3')
self.write('Query 1 results: %s<br>' % cursor1.fetchall())
self.write('Query 2 results: %s<br>' % cursor2.fetchall())
self.write('Query 3 results: %s' % cursor3.fetchall())
self.finish()
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("You requested the main page")
class StoryHandler(tornado.web.RequestHandler):
def get(self, story_id):
self.write(str(story_id))
application = tornado.web.Application([
(r"/", MainHandler),
(r"/story/([0-9]+)", StoryHandler),
(r"/test", SingleQueryHandler),
(r"/ltest", LSingleQueryHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
import tornado.web
import momoko
from tornado import gen
class BaseHandler(tornado.web.RequestHandler):
@property
def db(self):
# Create a database connection when a request handler is called
# and store the connection in the application object.
if not hasattr(self.application,
'db'):
self.application.db = momoko.AsyncClient({
'host':
'',
'database':
'',
'user':
'',
'password':
'',
'min_conn':
1,
'max_conn':
20,
'cleanup_timeout':
10
})
return self.application.db
class SingleQueryHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
# One simple query
cursor = yield gen.Task(self.db.execute,
'SELECT 42, 12, %s, 11;', (25,))
self.write('Query results: %s' % cursor.fetchall())
self.finish()
class LSingleQueryHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
# One simple query
cursor = yield gen.Task(self.db.execute,
'select count(*) from asd a,asd b,asd
c')
self.write('Query results: %s' % cursor.fetchall())
self.finish()
class BatchQueryHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
# These queries are executed all at once and therefore they need to be
# stored in an dictionary so you know where the resulting cursors
# come from, because they won't arrive in the same order.
cursors = yield gen.Task(self.db.batch, {
'query1': ['SELECT 42, 12, %s, %s;', (23,
56)],
'query2':
'SELECT 1, 2, 3, 4, 5;',
'query3':
'SELECT 465767, 4567, 3454;'
})
for key, cursor
in cursors.items():
self.write('Query results: %s = %s<br>' % (key, cursor.fetchall()))
self.finish()
class QueryChainHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
# Execute a list of queries in the order you specified
cursors = yield gen.Task(self.db.chain, (
['SELECT 42, 12, %s, 11;', (23,)],
'SELECT 1, 2, 3, 4, 5;'
))
for cursor
in cursors:
self.write('Query results: %s<br>' % cursor.fetchall())
self.finish()
class MultiQueryHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
cursor1, cursor2, cursor3 = yield [
gen.Task(self.db.execute, 'SELECT 42, 12, %s, 11;', (25,)),
gen.Task(self.db.execute, 'SELECT 42, 12, %s, %s;', (23,
56)),
gen.Task(self.db.execute, 'SELECT 465767, 4567, 3454;')
]
self.write('Query 1 results: %s<br>' % cursor1.fetchall())
self.write('Query 2 results: %s<br>' % cursor2.fetchall())
self.write('Query 3 results: %s' % cursor3.fetchall())
self.finish()
class CallbackWaitHandler(BaseHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
self.db.execute('SELECT 42, 12, %s, 11;', (25,),
callback=(yield gen.Callback('q1')))
self.db.execute('SELECT 42, 12, %s, %s;', (23,
56),
callback=(yield gen.Callback('q2')))
self.db.execute('SELECT 465767, 4567, 3454;',
callback=(yield gen.Callback('q3')))
cursor1 = yield gen.Wait('q1')
cursor2 = yield gen.Wait('q2')
cursor3 = yield gen.Wait('q3')
self.write('Query 1 results: %s<br>' % cursor1.fetchall())
self.write('Query 2 results: %s<br>' % cursor2.fetchall())
self.write('Query 3 results: %s' % cursor3.fetchall())
self.finish()
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("You requested the main page")
class StoryHandler(tornado.web.RequestHandler):
def get(self, story_id):
self.write(str(story_id))
application = tornado.web.Application([
(r"/", MainHandler),
(r"/story/([0-9]+)", StoryHandler),
(r"/test", SingleQueryHandler),
(r"/ltest", LSingleQueryHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
相关文章推荐
- epoll的io异步模型与tornado的关系
- tornado_5_异步web服务
- tornado异步客户端(gen.coroutine)
- tornado异步请求非阻塞
- 使用tornado让你的请求异步非阻塞
- 使用tornado让你的请求异步非阻塞
- tornado异步的mock以及装饰器
- Tornado异步
- tornado异步客户端(Future)
- tornado实现异步计划任务及python常见计划任务方法 推荐
- Tornado Celery Redis实现异步
- tornado web异步框架 和 nodejs 的异步对比
- 异步连接池整理step2
- Tornado源码分析系列之一: 化异步为'同步'的Future和gen.coroutine
- MySQL的连接池、异步、断线重连
- HttpAsyncClient (异步http 请求)的连接池使用
- django在nginx uwsgi和tornado异步方案在项目中的体验
- 使用tornado让你的请求异步非阻塞
- Thrift之C++ 异步连接池实例
- 深入理解异步Web服务器 Tornado