pyodbc 支持多处理吗?

问题描述 投票:0回答:1

下面代码的目的是使用 pyodbc 和 mysql 并行执行多个数据库更新。问题:连接是否独立且并行打开?这段代码可以工作还是我需要采取不同的方法?我尝试研究 pyodbc 和多线程,但没有发现太多。

import multiprocessing, pyodbc

tables = ['tab1', 'tab2', 'tab3', 'tab4', 'tab5', 'tab6']
for table in tables:
    p = multiprocessing.Process(target=process_table, args=(table,))
    p.start()


def process_table(table):

    conn = pyodbc.connect(.....)
    cursor = conn.cursor()
    
    for i in range(0, 10):   
        sql = 'update ' + table + ' set col = ' + str(i)
        cursor.execute(sql)
    
    conn.commit()

    cursor.close()
    conn.close()
python python-multiprocessing python-multithreading pyodbc
1个回答
0
投票

咱们进入正题吧。

  1. 连接是否独立且并行打开?
    • 是的,但有一个问题取决于您的期望。
  2. 这段代码有效还是我需要采取不同的方法?
    • 这段代码应该可以工作。但您需要了解数据库受 I/O 限制,而不是计算限制。当您创建新进程时,基础 I/O 限制仍然保持不变。最好使用线程代替。了解参数,然后评估它将如何使您的用例受益。

这是有关如何使用线程执行此操作的示例代码:

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import pyodbc

executor = ThreadPoolExecutor() # or ProcessPoolExecutor
tables = ['tab1', 'tab2', 'tab3', 'tab4', 'tab5', 'tab6']
futures = []
for table in tables:
    result = executor.submit(process_table, table)
    futures.append(result)

results = [future.result() for future in futures]

def process_table(table):

    conn = pyodbc.connect(.....)
    cursor = conn.cursor()
    
    for i in range(0, 10):   
        sql = 'update ' + table + ' set col = ' + str(i)
        cursor.execute(sql)
    
    conn.commit()

    cursor.close()
    conn.close()

让我们深入研究 ODBC 中的一些有用参数,如参考中所列:

SQL_MAX_CONCURRENT_ACTIVITIES一个 SQLUSMALLINT 值,指定驱动程序可以支持连接的最大活动语句数。SQL_MAX_ASYNC_CONCURRENT_STATEMENTS如果没有特定限制或限制未知,则该值为零。您可以通过打印来了解它们的值:
参数 描述
SQL_MULT_RESULT_SETS 字符串:如果数据源支持多个结果集,则为“Y”;如果不支持,则为“N”。有关多个结果集的更多信息,请参阅多个结果
SQL_MULTIPLE_ACTIVE_TXN 一个字符串:如果驱动程序同时支持多个活动事务,则为“Y”;如果任何时候只能有一个事务活动,则为“N”。该信息类型返回的信息不适用于分布式事务。
SQL_MAX_DRIVER_CONNECTIONS 一个 SQLUSMALLINT 值,指定驱动程序可以支持的环境的最大活动连接数。此值可以反映驱动程序或数据源施加的限制。如果没有指定限制或限制未知,则该值设置为零。
如果语句有未决结果,则该语句被定义为活动状态,术语“结果”表示来自 SELECT 操作的行或受影响的行通过 INSERT、UPDATE 或 DELETE 操作(例如行计数),或者处于 NEED_DATA 状态。该值可以反映驱动程序或数据源施加的限制。如果没有指定限制或限制未知,则该值设置为零。
一个 SQLUINTEGER 值,指定驱动程序在给定连接上可以支持的异步模式下活动并发语句的最大数量。
print(conn.getinfo(pyodbc.SQL_MAX_DRIVER_CONNECTIONS)) print(conn.getinfo(pyodbc.SQL_MAX_DRIVER_CONNECTIONS)) print(conn.getinfo(pyodbc.SQL_MAX_CONCURRENT_ACTIVITIES)) print(conn.getinfo(pyodbc.SQL_MAX_ASYNC_CONCURRENT_STATEMENTS))

此外,还有一个协议允许单个连接同时运行多个并发查询:
SQL Server 2005 (9.x) 引入了一种新的连接属性,该属性允许应用程序每个连接有多个待处理请求,特别是每个连接有多个活动默认结果集,称为 

多个活动结果集 (MARS) )

。此外,还添加了一个新的连接字符串关键字

Mars_Connection。它接受“是”或“否”值; “否”是默认值。对于 pyodbc,您可以通过将 MARS_Connection=yes

 添加到连接字符串来启用它。

使用火星
  • 但是,MARS 中单个连接上的多个查询的执行是“交错”的,而不是并发的。如果您希望两个查询实际上同时执行,请使用两个连接(就像通过单独的进程所做的那样)。驱动程序在一个连接上一次只能处理一个查询。

© www.soinside.com 2019 - 2024. All rights reserved.