繁体   English   中英

python multiprocessing db访​​问非常慢

[英]python multiprocessing db access is very slow

我有使用psycopg2与GUI进行交互的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

尝试隔离所花费的时间-是多处理还是数据库? 例如,尝试直接从python交互式外壳程序调用数据库-ipython外壳程序具有“ time”和“ timeit”命令,用于测量类似这样的事情。 或者,将DataBase.execute存根以返回固定值,并查看其区别。

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

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

另外,我不确定(您的示例是否小到可以推断),但是您似乎为每个查询打开了新的数据库连接...您是否在每个查询之后关闭与self.conn.close()连接? 您应该拥有一个持久的连接。

似乎是Ubuntu 9.10的问题或错误

在Ubuntu 9.04和Win32上,即使在Ubuntu 9.10上托管的虚拟机上的win32上,也都可以正常工作。

感谢所有的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM