psycopg2를 사용하여 postgres 데이터베이스와 상호 작용할 GUI가 있습니다. 다중 처리 프로세스에서 db 연결을 사용하고 다중 처리 대기열을 통해 SQL을 보내고 다른 대기열을 통해 수신합니다.파이썬 멀티 프로세싱 db 액세스가 매우 느림
문제는 속도가 매우 느립니다. 작은 테이블 (30 개 행)의 간단한 select *는 1/10th 초 또는 1 초 이상 걸릴 수 있습니다.
왜 그렇게 느린 지에 대한 단서가 있습니까?
새로운 정보 : 그것은 WINXP, 동일한 코드에 잘 작동하므로 간헐적 인 지연은 단지 내 리눅스 박스에 무슨 일이 일어나고 (우분투 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 개의 셀렉트를 실행하는 것은 "python db_test.py"를 사용하여 쉘에서 시간 (python 시작 시간 포함)을 약 0.3 초 걸립니다. 오늘 밤에 반환 할 때 통조림 값을 줄 것입니다 상자 작업시) timeout_add는 요청이 db로 보내지면 대기열을 폴링하기 시작합니다. 사용자가 응용 프로그램과 상호 작용할 수있게 해주는 GUI 기본 루프의 일부입니다. – Rob