2017-08-24 101 views
1

我正在做一個很簡單的例子,使用'多處理'中的'Pool'並行工作。我想要做的是同時啓動許多SQL查詢。池多處理失敗

我已經激活了WAL模式以允許同時進行多個讀/寫操作。

def FUNC1():   
    conn = sqlite3.connect("DB.db") 
    cur = conn.cursor() 

    cur.execute(QUERY1) 
    print "TEST" 

    cur.close() 
    conn.close() 
    return 

def FUNC2(): 
    conn = sqlite3.connect("DB.db") 
    cur = conn.cursor() 

    cur.execute(QUERY2) 

    cur.close() 
    conn.close() 

    return 

if __name__ == '__main__': 

    conn = sqlite3.connect("DB.db") 
    cur = conn.cursor() 
    cur.execute('PRAGMA journal_mode=wal') 
    pool = Pool(processes=2) 

    pool.map_async(FUNC1,"") 
    pool.map_async(FUNC2,"") 


    cur.close() 
    conn.close() 

終端應該顯示一個print:'TEST',它表明程序已經完成了FUNC1操作。問題是它什麼都沒顯示。

有誰知道爲什麼?


編輯

我已經改變了代碼(謝謝你「馬塔」!),現在的問題是,沒有並行工作。

其實查詢需要3秒,執行和如果我通過三次相同的查詢最終的時間是9 ...

爲什麼?

def Query(Query): 

    conn = sqlite3.connect("DB.db") 
    cur = conn.cursor() 

    curOperations.execute(Query) 

    cur.close() 
    conn.close() 

    return 


if __name__ == '__main__': 

    conn = sqlite3.connect("DB.db") 
    cur = conn.cursor() 

    cur.execute('PRAGMA journal_mode=wal') 
    conn.commit() 

    pool = Pool(processes=2) 

    pool.map_async(Query,['QUERY1', 'QUERY2', 'QUERY3']) 

    pool.close() 
    pool.join() 

    cur.close() 
    conn.close() 
+0

僅當您使用多個連接時,WAL模式併發纔有效。 –

+0

我該如何建立多個連接?我應該將數據庫連接到每個FUNC嗎? – Ralk

+0

如果你不介意,你能來解決這個[問題](https://stackoverflow.com/questions/45816730/convert-dataframe-columns-to-objects-efficiently)嗎? –

回答

1

Pool.map_async()使用所提供的iterable的每個元素作爲參數調用一次函數。您提供了一個空的可迭代(空字符串),所以該函數從不被調用。 Pool.apply_async()可能是你在找什麼。

+0

非常感謝! :)它的工作,但不幸的是沒有平行的工作(如果我通過三次相同的查詢時間也是3倍) – Ralk