我有GUI將與postgres數據庫交互,使用psycopg2。我在多處理進程中有db連接,並通過多處理隊列發送SQL,並通過另一個隊列接收。python多處理db訪問非常慢
問題是速度非常慢。一個簡單的select *從一個小表(30行)可以是十分之一秒,或可以超過一秒鐘。
有沒有人有任何線索,爲什麼它如此緩慢?
新的信息:它的工作原理在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
是的,我已經嘗試過。只需在一個進程中運行一個100選項,從shell使用「time python db_test.py」時需要大約0.3秒(包括python啓動時間) 當我今晚返回時,我將給出一些值(不包括linux在工作中) timeout_add在請求發送到數據庫後開始輪詢隊列,它是GUI主循環的一部分,允許用戶繼續與應用程序進行交互。 – Rob 2009-11-18 18:34:17