在Twisted中使用MongoDB。为什么我不应该使用pymongo?

时间:2015-02-09 20:46:20

标签: python mongodb pymongo

我读过我不应该在扭曲的项目中使用pymongo,因为pymongo不是异步的。我对理解这个想法有疑问......据我所知,我应该将我的代码放到Deferred中以避免阻止我的应用程序。我对吗?所以所有数据库操作都应该在Deferred方法中?看看这个:

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()) 

我是否正确地做到了?

1 个答案:

答案 0 :(得分:3)

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

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

然而,这是扭曲的精神。 Twisted提供从头开始访问网络编程协议 - 原始,一直到加密层。所以使用像这样的pymongo模块只是绕开完全扭曲的目的。在紧要关头,确定你可以使用它作为一个临时解决方案,但你没有得到强大的扭曲框架的任何好处,事件驱动系统的可扩展性和你的数据库访问仍然会在一个线程容量 - 即使扭曲是异步运行。

看看像txmongo这样的东西,看看扭曲的方式: https://github.com/twisted/txmongo

另外:你的代码看起来没有为handle()方法提供正确数量的参数,你提供数据(1个参数),但它需要2个参数。

同样:在PEP8之后你可能想要考虑pythonic代码的一致代码,twisted中的命名方案是camel case,以及回调方法没有以' on'为前缀,它们要么是以cb,eb或none为前缀。