gpt4 book ai didi

Python multiprocessing-将结果写在同一个文件中

转载 作者:行者123 更新时间:2023-11-28 21:05:40 25 4
gpt4 key购买 nike

我有一个简单的函数,可以将一些计算的输出写入 sqlite 表中。我想在 Python 中使用多处理并行使用这个函数。我的具体问题是当每个进程试图将其结果写入同一个表时如何避免冲突?运行代码给我这个错误:sqlite3.OperationalError:数据库被锁定。

import sqlite3
from multiprocessing import Pool

conn = sqlite3.connect('test.db')
c = conn.cursor()
c.execute("CREATE TABLE table_1 (id int,output int)")

def write_to_file(a_tuple):
index = a_tuple[0]
input = a_tuple[1]
output = input + 1
c.execute('INSERT INTO table_1 (id, output)' 'VALUES (?,?)', (index,output))

if __name__ == "__main__":
p = Pool()
results = p.map(write_to_file, [(1,10),(2,11),(3,13),(4,14)])
p.close()
p.join()

Traceback (most recent call last):
sqlite3.OperationalError: database is locked

最佳答案

使用是个好主意。

我看到了这个问题的三种可能解决方案。

首先,不是让池 worker 尝试将数据插入数据库,而是让 worker 将数据返回给父进程。

在父进程中,使用imap_unordered代替map。这是一个可迭代对象,一旦值可用就开始提供值。然后父级可以将数据插入数据库。

这将序列化对数据库的访问,防止出现问题。

如果要插入数据库的数据相对较小,但更新经常发生,则首选此解决方案。因此,如果更新数据库所花费的时间与计算数据所花费的时间相同或更多。


其次,您可以使用Lock。那么 worker 应该

  • 获取锁,
  • 打开数据库,
  • 插入值,
  • 关闭数据库,
  • 释放锁。

这将避免将数据发送到父进程的开销。但相反,您可能会让工作人员停滞不前,等待将他们的数据写入数据库。

如果要插入的数据量很大,这将是首选解决方案,但计算数据的时间要比将数据插入数据库的时间长得多。


第三,您可以让每个工作人员写入自己的数据库,然后合并它们。你可以这样做 directly in sqlite甚至 in Python .虽然有大量数据我不确定后者是否有优势。

关于Python multiprocessing-将结果写在同一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43691588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com