【问题标题】:Using sqlalchemy and Sqlite with Multiprocessing将 sqlalchemy 和 Sqlite 与多处理一起使用
【发布时间】:2019-07-31 14:15:35
【问题描述】:

我需要同时在多个进程中运行 SQL 查询。这些进程可以使用完全不同的数据库,因此不需要跨进程共享任何内容。在每个进程中,我创建一个连接到唯一数据库的引擎并尝试连接到该数据库。 sqlalchemy 总是无法在至少一个进程中建立数据库连接。

我已将代码缩减为仅创建一个引擎并在每个进程中建立与该引擎的连接。每个引擎都是在一个流程中建立的,而不是共享的。每个连接都是如此。数据库也是唯一的,所以锁应该不是问题。但是,一个进程总是无法与其数据库建立连接。

import multiprocessing as mp
import sqlalchemy

def testing(iteration):
    engine = sqlalchemy.create_engine('sqlite:///test_db_{}'.format(iteration), 
                                  echo = True)

    print("Created engine for iteration {}".format(iteration))

    with engine.connect() as conn:
        print("Established database connection for iteration {}".format(iteration))

pool = mp.Pool(4)
results = pool.map(testing, range(4))
pool.close()
pool.join()

输出应该如下(尽管不一定按照这个确切的顺序):

Created engine for iteration 0
Created engine for iteration 1
Created engine for iteration 2
Created engine for iteration 3
Established database connection for iteration 0
Established database connection for iteration 1
Established database connection for iteration 2
Established database connection for iteration 3

但是,我从来没有看到“为迭代 0 建立数据库连接”并且程序挂起。

这是 sqlalchemy 的普遍问题吗?它是sqlite特有的吗?还是我完全错过了什么?感谢您的帮助。

【问题讨论】:

    标签: python sqlite sqlalchemy multiprocessing


    【解决方案1】:

    原来这个问题只有在使用Sqlite的时候才会出现。切换到 MySQL 可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 2012-03-04
      • 1970-01-01
      • 2018-03-10
      • 2023-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      相关资源
      最近更新 更多