我有使用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
答案 0 :(得分:0)
尝试隔离花费时间的东西 - 是多处理还是数据库?例如,尝试直接从python交互式shell调用数据库 - ipython shell有'time'和'timeit'命令来测量这样的事情。或者,将DataBase.execute存根以返回固定值,并查看它有什么不同。
gobject.timeout_add怎么样?那是做什么的?延迟可能在那里,而不是数据库或多处理代码。
答案 1 :(得分:0)
您是否尝试为每个进程打开新的数据库连接?在我看来,你只是在增加开销,试图在不同的进程中重用它们。
另外,我不确定(您的示例是小的推断)但看起来您正在为每个查询打开新的数据库连接...您是否在每次查询后关闭与self.conn.close()
的连接?你应该有一个持久的联系。
答案 2 :(得分:0)
这似乎是Ubuntu 9.10特有的问题或错误
所有在Ubuntu 9.04和win32上运行正常,即使在Ubuntu 9.10上托管的虚拟机上的win32上也是如此。
感谢您的所有建议。