python - 我可以使用多处理来使用 sqlalchemy 查询不同的服务器吗?
问题描述
我有一些我想并行查询的 sql 服务器。为此,我尝试将请求放入进程中,因为它不是我尝试多次查询的服务器,而是我只查询一次的许多服务器:
import pandas as pd
from sqlalchemy import create_engine
from multiprocessing import Pool, cpu_count
def get_df(engine):
sql_string = "select * from sys.all_columns"
df = pd.read_sql(sql=sql_string, con=engine)
return df
def create_odbc_engine(server):
db_odbc_string = "mssql+pyodbc://@{server}-db:9999/some_database?driver=ODBC+Driver+17+for+SQL+Server".format(
server=server)
return create_engine(db_odbc_string)
if __name__ == "__main__":
servers = ["server1", "server2", "server3",...]
args = [(create_odbc_engine(server),) for server in servers]
n_processes = cpu_count() - 1
with Pool(processes=n_processes) as pool:
results = pool.map(get_df, args)
但是我得到泡菜错误:
AttributeError: Can't pickle local object 'create_engine.<locals>.connect'
有什么办法可以并行执行吗?
解决方案
Python 不能腌制函数,所以你不能create_odbc_engine
在 args 中发送函数。您可以改为在 get_df
.
import pandas as pd
from sqlalchemy import create_engine
from multiprocessing import Pool, cpu_count
def get_df(server):
engine = (create_odbc_engine(server),)
sql_string = "select * from sys.all_columns"
df = pd.read_sql(sql=sql_string, con=engine)
return df
def create_odbc_engine(server):
db_odbc_string = "mssql+pyodbc://@{server}-db:9999/some_database?driver=ODBC+Driver+17+for+SQL+Server".format(
server=server)
return create_engine(db_odbc_string)
if __name__ == "__main__":
servers = ["server1", "server2", "server3",...]
# args = [(create_odbc_engine(server),) for server in servers]
n_processes = cpu_count() - 1
with Pool(processes=n_processes) as pool:
results = pool.map(get_df, servers)
推荐阅读
- litho - Facebook Litho:片段恢复时未触发可见事件
- node.js - 启动/升级作曲家网络中的问题:意外的令牌常量
- java - MacOS Eclipse IDE 运行具有旧 Java 版本的应用程序
- c# - C# Post,Webrequest 循环不工作,循环 i = 2 然后没有结果
- sql - 如何获得仅按最后日期选择的结果?
- c - 在 C 中格式化文本
- javascript - 每次 var 更改后更新 res.locals?
- php - 为 foreach() -Laravel 提供的参数无效
- spring-mvc - 如何在 Thymeleaf 每个循环中编写条件表达式?
- jmeter - jmeter http 标头管理器授权字段“错误的身份验证数据”