2015-02-09 97 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爲前綴,沒有或沒有。

相關問題