我读到不应该在twisted项目中使用pymongo,因为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())

我做得对吗?

最佳答案

你认为pymongo不是异步的,这是正确的。您应该花些时间学习异步(事件循环)系统和线程系统之间的区别。它们是编程系统的根本不同方法。
在您的方法中,您使用了deferToThread方法,它将延迟到线程释放并返回一个值,并且由于twisted.internet.threads的魔力,它将异步发生。
然而,这是在可怜的精神扭曲。Twisted提供对网络编程协议的访问,从底层到底层,一直到加密层。所以像这样使用pymongo模块只是为了完全避免twisted的目的。在紧要关头,您当然可以将此作为权宜之计,但您并没有从健壮的Twisted框架中获得任何好处,事件驱动系统的可伸缩性和数据库访问仍将以线程容量运行—即使Twisted是异步运行的。
看一看Txmongo这样的东西,看看它扭曲的方式:
https://github.com/twisted/txmongo
另外:您的代码看起来没有为handle()方法提供正确数量的参数,您提供了数据(1个参数),但它需要2个参数。
同样:在pep8之后,您可能需要考虑与pythonic代码相比的一致性代码,twisted中的命名方案是camel case,并且回调方法没有前缀“on”,它们或者前缀是cb、eb或none。

09-25 20:09
查看更多