【问题标题】:How to make asynchronous database operations with Twisted?如何使用 Twisted 进行异步数据库操作?
【发布时间】:2014-02-24 08:59:40
【问题描述】:

我是与 Twisted 合作的新手。我有很多客户端将数据永久发送到服务器,服务器必须将这些数据插入数据库(Postgresql)。

我的问题是我的服务器没有异步运行:

例如:在 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()

【问题讨论】:

    标签: postgresql asynchronous twisted


    【解决方案1】:

    【讨论】:

    • 谢谢让-保罗爵士,我发现我的问题是我对所有客户端都使用了一个单一的进程,所以服务器一个一个(同步地)为它们服务是正常的。
    • 那是……确实如此。但是,大多数基于 Twisted 的应用程序只使用一个进程(和一个线程)。您仍然可以从异步与数据库对话中受益。例如,数据库可能运行多个进程。如果出现两个客户端并导致您运行两个 SELECT 语句,则数据库可能能够同时处理它们。如果您使用异步 API 与数据库对话,那么您就有可能发生这种情况。如果您使用同步 API,那么您的应用程序甚至不会尝试要求数据库同时执行这两项操作。
    • 我有一个问题,Jean-Paul 爵士:为什么 Twisted 不为每个新客户创建一个线程,然后将工作推迟到线程(在我的情况下,客户的最大数量是 400)?
    • 因为 Twisted 不是用于多线程应用程序开发的库。 Twisted 是一个用于协作多任务和事件驱动应用程序开发的库。如果你想要大量的线程来左右旋转,那么你可能需要一个不同的库。
    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2018-05-08
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多