tornado中使用motor异步操作mongodb

http://motor.readthedocs.org/en/stable/

motor是一个建立在tornado和mongodb上的异步操作库,能够实现所有的mongodb操作。

一:导入module
  1. import motor

二:连接mongodb


  1. [python]  view plain copy
    1. db = motor.MotorClient('10.28.0.163').open_sync().project_test  

与pymongo的不同在与使用motor时必须加上 open_sync(),这里的连接时异步的。

相同情况下使用pymongo的命令为:

[python]  view plain copy
  1. db = pymongo.Connection('10.28.0.163').project_test     
  2. #这样是blocking的  

三:操作mongodb
motor主要提供了两种操作mongodb的形式

1:第一种是在原有pymongo操作的基础上加入了回调函数
例如
[python]  view plain copy
  1. #原来的pymongo操作  
  2. find = db.test.find_one({'key':'value'})  
  3. new = db.test.update({'spec':'spec'},{'$set':{'key':'value'}})  

[python]  view plain copy
  1. #motor操作  
  2. find = db.test.find_one({'key':'value'},callback=_on_result1)  
  3. new = db.test.update({'spec':'spec'},{'$set':{'key':'value'}},callback = _on_result2)  
  4. @tornado.web.asynchronous  
  5. def _on_result1(result,error):  
  6.         if error:  
  7.                 do something  
  8.         do something  
  9. def _on_result1(result,error):  
  10.         if error:  
  11.                 do something  
  12.         do something  


关于某些mongodb操作的回调函数的使用,motor有特别的规定,如find()需要调用motor的to_list(),具体情况需要用时请查询motor文档http://motor.readthedocs.org/en/stable/index.html


2.第二种方法, motor还提供了基于tornado的gen模块的操作,简单来说就是不在需要调用回调函数,而是采用yield来实现异步。
还是用上面的两个命令为例:
[python]  view plain copy
  1. #motor操作  
  2. import tornado  
  3. import motor  
  4. class someHandler(tornado.web.RequestHandler):  
  5.     @tornado.web.asynchronous  
  6.     def post(self):  
  7.         ......do something....  
  8.         self.operation(db)  
  9.         ....do something ....  
  10.     @tornado.gen.engine  
  11.     def operation():  
  12.         find = yield motor.Op(db.test.find_one,{'key':'value'})  
  13.         new =yield motor.Op(db.test.update,{'spec':'spec'},{'$set':{'key':'value'}})  



这里,yield motor.Op(...) 将里面的内容异步执行,并根据异步执行的结果返回不同的值:
                    若执行结果是一个error,则返回error=some_error
                    若执行结果没有出错,则返回result = some_result
需要注意的是若要使用这种方法必须要加上标识@tornado.gen.engine
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值