多处理性能



我创建了一个非常简单的脚本,可以处理多处理和SQL。本练习的目的是获得最短的执行时间:

def Query(Query):
conn = sqlite3.connect("DB.db")
cur = conn.cursor()  
cur.execute(Query)
cur.close()
conn.close()
return

if __name__ == '__main__':
conn = sqlite3.connect("DB.db")
cur = conn.cursor()
start = time.time()
curOperations.execute(QUERY)
curOperations.execute(QUERY)
curOperations.execute(QUERY)
end = time.time()
TIME1 = end - start
cur.execute('PRAGMA journal_mode=wal')
conn.commit()
start = time.time()
pool = Pool(processes=2)
pool.imap(Query,[QUERY, QUERY, QUERY])
pool.close()
pool.join()
end = time.time()
TIME2 = end - start
cur.close()
conn.close()

执行 20 次后 TIME1 的平均结果为 13.43,TIME2 的平均结果为 10.39。

不应该比这低吗?! 我做错了什么吗?

对于我的答案,我将假设您的查询仅从数据库中读取内容。

在尝试使某些东西更快之前,您需要知道究竟是什么阻止了该过程变得更快。 并非所有的速度问题都可以通过多处理来改进!

因此,您真正需要做的是分析应用程序以查看它花费的时间。

由于 SQLite 对查询进行缓存,因此我建议在单个进程中分别对查询的每次执行进行计时。 我怀疑第一个查询比下一个查询花费更长的时间。

还要考虑多处理情况下的开销。查询必须通过 IPC 进行酸洗并发送到工作进程。然后,每个工作线程必须创建一个连接和光标,然后关闭它们。在现实世界中,您的查询函数会对数据执行某些操作,例如将其返回到主进程,这也需要对其进行酸洗并通过 IPC 发送。

由于所有工作线程都访问同一个数据库,因此在某些时候,从数据库中读取数据将成为瓶颈。

如果查询修改了数据库,则无论如何都会序列化访问以防止篡改。

最新更新