2014-02-24 79 views
3

我是一個與Twisted合作的新手。我有很多客戶端將數據永久發送到服務器,服務器必須將這些數據插入數據庫(Postgresql)。如何使用Twisted進行異步數據庫操作?

我的問題是我的服務器不異步地表現:

例如:在t = 0時,一個客戶端發送採取在數據庫中被插入30秒在T = 10的數據:另一個客戶端發送數據發送到服務器:第二個客戶端必須等待20秒(30-10),直到服務器插入第一個客戶端的數據。

我希望數據不需要等待就可以異步插入。一點幫助將非常感激。這裏是我的代碼:

from twisted.internet import reactor, protocol 
from twisted.python import log 
import sys,psycopg2 

class Server(protocol.Protocol): 

    def dataReceived(self, data): 
     self.client_host = self.transport.getPeer().host 
     self.client_port = self.transport.getPeer().port 
     cursor=self.factory.connection.cursor() 
     self.factory.insert_data(data,self.client_host,cursor) 

    def connectionLost(self, reason): 
     log.msg('Connection lost from %s:%s.\n' % (self.client_host,str(self.client_port)))    

class My_Factory(protocol.ServerFactory): 

    protocol = Server 

    def __init__(self): 
      params="host='127.0.0.1' port='5432' dbname='my_db' user='user' password='my_pwd'" 
      try: 
       self.connection= psycopg2.connect(params) 
       self.connection.autocommit = True 
      except Exception as e: 
       log.msg("Cannot connect to database!! Please verify connection params. Reason: %s"%str(e)) 
       sys.exit(0) 


    def insert_data(self,data,adress,cursor): 
     try: 
      query = """INSERT INTO my_table(
          data,client_adress, date) 
          VALUES (%s, %s, now()); 
        """%(data,adress) 
      cursor.execute(query) 
     except Exception as e: 
      log.msg("Error: "+str(e)) 




def main(argv): 
    log.startLogging(sys.stdout)() 
    my_factory=My_Factory() 
    reactor.listenTCP(8000,my_factory) 
    reactor.run() 

if __name__ == '__main__': 
    main() 

回答

2
+0

謝謝Sir Jean-Paul, 我發現我的問題是我對所有客戶端都使用SINGLE進程,所以服務器一個接一個地(同步地)服務它是正常的。 – Andromida

+0

......這是真的。不過,大多數基於Twisted的應用程序只使用一個進程(和一個線程)。您仍然可以通過異步與數據庫交談獲益。例如,數據庫可能運行多個進程。如果兩個客戶端出現並導致您運行兩條SELECT語句,那麼數據庫可能會同時處理它們。如果您使用異步API與數據庫交談,那麼您就有可能發生這種情況。如果您使用同步API,那麼您的應用程序甚至不會試圖要求數據庫同時執行它們。 –

+0

我有一個問題讓 - 保羅: 爲什麼扭曲不爲每個新客戶創建一個線程,然後將工作推遲到線程(在我的情況下,客戶的最大數量是400)? – Andromida

相關問題