gpt4 book ai didi

python - SQLite 使用多处理读取,而不启动 imap

转载 作者:行者123 更新时间:2023-12-01 04:44:08 24 4
gpt4 key购买 nike

我已经尝试了我能想到的一切,但我无法弄清楚为什么以下多处理代码不会启动循环:

import sqlite3, itertools

# Dummy table
conn = sqlite3.connect(":memory:")
conn.execute('CREATE TABLE numbers (num integer)')
conn.executemany("INSERT INTO numbers VALUES (?)",
((x,) for x in range(5)))
conn.commit()

cmd_search = "SELECT * FROM numbers"
cursor = conn.execute(cmd_search)

def nothing(x): return x

import multiprocessing
P = multiprocessing.Pool()
#ITR = P.imap(nothing,cursor) # parallel version
ITR = itertools.imap(nothing, cursor) # serial version

for x in ITR: print x

当我使用“串行”版本(使用 itertools.imap)运行它时,我得到了 (0,) (1,) (​​2,) (3, )(4,)。使用 multiprocessing.imap 版本,我什么也没得到,循环会默默退出。我显然与 sqlite 光标有关,切换到 cursor=range(5) 有效。

为什么多重处理在这里不起作用?

最佳答案

默认情况下,sqlite3 不会让您在实际创建它的线程之外访问它的任何对象。 multiprocessing.Pool 使用后台线程对对象进行排队,这违反了此规则。您可以通过将 check_same_thread=False 传递给 sqlite3.connect 来禁用该检查:

conn = sqlite3.connect(":memory:", check_same_thread=False)

一旦我进行了更改,您的代码就运行良好。如果没有这种更改,我会看到以下错误:

ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 140082824808256 and this is thread id 140082770409216

我不确定为什么您没有看到任何错误消息;我没有得到的唯一方法是删除 for x in ITR: print x 行,因为没有它,您实际上不会尝试从 Pool 检索结果code>,这将抑制其中发生的任何错误。

关于python - SQLite 使用多处理读取,而不启动 imap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29860557/

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