1

我有使用 psycopg2 与 postgres 数据库交互的 GUI。我在多处理进程中有数据库连接,并通过多处理队列发送 SQL,并通过另一个队列接收。

问题是速度非常非常慢。一个简单的从小表(30 行)中选择 * 可能需要 1/10 秒,也可能需要超过一秒。

有没有人知道为什么它这么慢?

新信息:它在 winxp 上运行良好,代码完全相同,所以间歇性延迟只发生在我的 linux 机器上(ubuntu 9.10)

更多信息:删除选择后,它似乎不是问题。

这是 db 类的主要部分。

class DataBase(multiprocessing.Process):

    def __init__(self, conn_data, in_queue, out_queue):
        multiprocessing.Process.__init__(self)
        self.in_queue = in_queue
        self.out_queue = out_queue
        self.conn_data = conn_data
        self.all_ok = True

    def run(self):  
        proc_name = self.name
        self.conn = self.get_connection(self.conn_data)
        print("Running ", self.name)
        while True:
            next_job = self.in_queue.get()
            print("Next Job: ",next_job)
            if next_job is None:
                # Stop Process
                break
            SQL = next_job[0]
            callback = next_job[1]
            result = self.execute(SQL)
            self.out_queue.put((result, callback))
        print("Closing connection ", self.name)
        self.conn.close()
        return      

在GUI中我有这个:

def recieve_data(self):
    "Revived data on the queue.  Data is a tuple of the actual data and a calback name."
    if self.recieve_queue.empty() == False:
        data = self.recieve_queue.get()
        callback_name = data[1]
        try:
            callback = getattr(self, callback_name)
            callback(data[0])
        except AttributeError as e:
            util.error_ui(err = e)
        self.check_data_timeout = None
        return False # Stop checking.
    return True  # Have the main loop keep checking for data.

def request_data(self, SQL, callback):
    self.send_queue.put((SQL, callback))
    self.check_data_timeout = gobject.timeout_add(50, self.recieve_data) # Poll the database recieved_queue
4

3 回答 3

0

这似乎是 Ubuntu 9.10 特有的问题或错误

在 Ubuntu 9.04 和 win32 上一切正常,即使在 Ubuntu 9.10 上托管的虚拟机上的 win32 上也是如此。

感谢所有的建议。

于 2009-11-19T17:31:02.973 回答
0

您是否尝试过为每个进程打开新的数据库连接?在我看来,您只是在增加开销,试图在不同的进程中重用它们。

另外,我不确定(您的样本太小无法推断)但看起来您正在为每个查询打开新的数据库连接......您是否self.conn.close()在每次查询后关闭连接?你应该有一个持久的连接。

于 2009-11-18T08:59:49.363 回答
0

尝试找出花时间的东西——是多处理还是数据库?例如,尝试直接从 python 交互式 shell 调用数据库——ipython shell 有“time”和“timeit”命令来测量这样的事情。或者存根 DataBase.execute 以返回固定值,看看它有什么不同。

gobject.timeout_add 呢?那是在做什么?延迟可能在那里而不是数据库或多处理代码。

于 2009-11-18T08:51:10.627 回答