我读过我不应该在扭曲的项目中使用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())
我是否正确地做到了?
答案 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为前缀。