2016-06-22 7 views
2

Ich habe zwei Funktionen, die ich zum Abfragen der Datenbank verwenden. Angenommen, zwei separate Abfragen, wie diese parallel ausgeführt werden, um die gleiche Datenbank abzufragen, und warten Sie auf beide Ergebnisse zurück, bevor Sie die Ausführung des restlichen Codes fortsetzen?So verwenden Sie Python, Datenbank parallel abzufragen

def query1(param1, param2): 
    result = None 
    logging.info("Connecting to database...") 
    try: 
     conn = connect(host=host, port=port, database=db) 
     curs = conn.cursor() 
     curs.execute(query) 
     result = curs 
     curs.close() 
     conn.close() 
    except Exception as e: 
     logging.error("Unable to access database %s" % str(e)) 
    return result 


def query2(param1, param2): 
    result = None 
    logging.info("Connecting to database...") 
    try: 
     conn = connect(host=host, port=port, database=db) 
     curs = conn.cursor() 
     curs.execute(query) 
     result = curs 
     curs.close() 
     conn.close() 
    except Exception as e: 
     logging.error("Unable to access database %s" % str(e))  
    return result 
+0

ich denke, man einen Blick auf die nehmen kann [ 'threading'] (https: // docs .python.org/3/library/threading.html) Bibliothek aus der Standardsammlung. Es gibt einige gute Beiträge hier, die erklären, wie man Python-Threads benutzt (und ihre Rückgabewerte sammelt), wie http://stackoverflow.com/questions/6893968/how-to-get-the-return-value-from-a-thread- In-Python (es ist nicht wirklich * Parallelität * auf Python-Seite, aber beide Anfragen werden fast gleichzeitig gemacht). – mgc

Antwort

3

Hier ist ein Multi-Threaded-Code, der tut, was Sie versuchen zu erreichen:

from threading import Thread, Lock 

class DatabaseWorker(Thread): 
    __lock = Lock() 

    def __init__(self, db, query, result_queue): 
     Thread.__init__(self) 
     self.db = db 
     self.query = query 
     self.result_queue = result_queue 

    def run(self): 
     result = None 
     logging.info("Connecting to database...") 
     try: 
      conn = connect(host=host, port=port, database=self.db) 
      curs = conn.cursor() 
      curs.execute(self.query) 
      result = curs 
      curs.close() 
      conn.close() 
     except Exception as e: 
      logging.error("Unable to access database %s" % str(e)) 
     self.result_queue.append(result) 

delay = 1 
result_queue = [] 
worker1 = DatabaseWorker("db1", "select something from sometable", 
     result_queue) 
worker2 = DatabaseWorker("db1", "select something from othertable", 
     result_queue) 
worker1.start() 
worker2.start() 

# Wait for the job to be done 
while len(result_queue) < 2: 
    sleep(delay) 
job_done = True 
worker1.join() 
worker2.join() 
+0

danke @ th3an0maly aber was ist q1 und q2? – ArchieTiger

+0

Hoppla, tut mir leid. Bearbeitete sie als "worker1" und "worker2". Ich hatte meinen Test zuerst mit diesen Variablennamen geschrieben und später geändert, damit sie mit deinem Code übereinstimmten :) – th3an0maly

+0

Danke! Übrigens habe ich einen Fehler bei 'result_queue.size <2' bekommen. Diese 'Liste hat keine Attributgröße', also änderte ich' while result_queue.size <2' zu 'len (result_queue) <2'. Und wie greife ich auf das individuelle Ergebnis beider Arbeiter zu? – ArchieTiger