2015-02-09 106 views
2

我读过,我不应该在扭曲的项目中使用pymongo,因为pymongo不是异步的。我在理解这个整个想法时遇到了问题......据我所知,我应该把我的代码延迟以避免阻止我的应用程序。我对吗?所以所有的数据库操作都应该在Deferred方法中?看看这个:在Twisted中使用MongoDB。为什么我不应该使用pymongo?

class Tracker(protocol.Protocol): 

    def __init__(self, factory): 

     self.db = factory.db 

    def dataReceived(self, data): 

     deferred = threads.deferToThread(self.handle, data) 
     deferred.addCallback(self.on_success) 
     deferred.addErrback(self.on_error) 

    def on_success(self, _None, response): 

     self.transport.write(response) 

    def on_error(self, failure): 

     logging.error('Error in deferred: %s' % failure.getErrorMessage()) 

    def handle(self, tracker, input): 

     self.db.buffer.insert({ }) # writing data to database 
     return 'success' 


class Server(protocol.Factory): 
    def __init__(self): 
     self.client = pymongo.MongoClient() 
     self.db = self.client.my_database 

    def buildProtocol(self, addr): 
     return Client(self) 

reactor.listenTCP(6969, Server()) 

我做得对吗?

回答

2

你认为pymongo不是异步的是正确的。您应该花一些时间并了解异步(事件循环)系统和线程系统之间的区别。它们是编程系统的根本不同的方法。

在你的方法中,你使用了deferToThread方法,它将推迟到线程释放并返回一个值,并且由于twisted.internet.threads的魔力而异步发生。

但是,这是扭曲的精神不佳。 Twisted从头开始提供对网络编程协议的访问 - 原始的,一直通过加密层。因此,像这样使用pymongo模块只是完全绕开了扭曲的目的。在一个小问题中,你可以把它当作一个权宜之计解决方案,但是你没有得到健壮的扭曲框架的任何好处,事件驱动系统的可扩展性和你的数据库访问仍然表现为线程容量 - 即使扭曲异步运行。

看一看像txmongo看到这样做的扭曲方式: https://github.com/twisted/txmongo

另外:你的代码看起来像它不提供的参数正确数量的handle()方法,你提供数据(1个参数),但期望2个参数。

再次说明:遵循PEP8,您可能需要考虑pythonic代码上的一致代码,twisted中的命名方案是camel case,以及回调方法没有以'on'作为前缀,它们要么以cb为前缀,没有或没有。

相关问题