2017-08-24 78 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