python多处理数据库访问速度非常慢

python多处理数据库访问速度非常慢,python,multiprocessing,Python,Multiprocessing,我有一个GUI,它将使用psycopg2与postgres数据库交互。我在多处理进程中有db连接,通过多处理队列发送SQL,通过另一个队列接收 问题是速度非常慢。从一个小表(30行)中进行简单的select*可以是十分之一秒,也可以超过一秒 有人知道它为什么这么慢吗 新信息:它在winxp上运行良好,代码完全相同,因此间歇性延迟只发生在我的linux机器上(ubuntu 9.10) 更多信息:删除了“选择”按钮后,似乎这不是问题所在 下面是db类的主要部分 class DataBase(mult

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

问题是速度非常慢。从一个小表(30行)中进行简单的select*可以是十分之一秒,也可以超过一秒

有人知道它为什么这么慢吗

新信息:它在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

试着找出需要花费时间的东西-是多处理还是数据库?例如,尝试直接从python交互式shell调用数据库-shell中有“time”和“timeit”命令用于度量类似的内容。或者,stubout-out-DataBase.execute返回固定值,看看它有什么不同


那么gobject.timeout\u add呢?那是干什么的?可能是延迟,而不是数据库或多处理代码。

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


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

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

在Ubuntu9.04和win32上,甚至在Ubuntu9.10上托管的虚拟机上的win32上,所有这些都可以正常工作


谢谢你的建议。

我为每个进程打开一个新连接,但在应用程序运行的整个过程中保持它打开。这允许不同的对象拥有各自的事务。我确实为每个查询创建了一个新的游标。是的,我已经尝试过了。仅在一个进程中运行100个select就需要大约0.3秒(包括python启动时间)作为shell的时间,使用“time python db_test.py”我将在今晚返回时尝试固定值(没有linux框在工作)。一旦请求发送到db,timeout_add将开始轮询队列,它是GUI主循环的一部分,允许用户与应用程序进行交互。