繁体   English   中英

如何在pyodbc中同时在n个游标上并行运行n个进程?

[英]How to run n processes on n cursors in parallel at a same time in pyodbc?

我有一个包含表名的列表,假设列表的大小为 n。 现在我有 n 个服务器,所以我打开了 n 个对应于每个也在另一个列表中的游标。 现在对于每个表,我想调用某个 function ,它将参数作为这两个列表。

templst = [T1,T2,T3,T4,T5]
curlst = [cur1,cur2,cur3,cur4,cur5]

for x in range(len(templst)):
   for y in range(len(curlst)):
       if( x == y):
           print "extracting of table ",templst[x]
           extract_single(curlst[y], tempst[x]);

我认为上面的代码不会并行运行,也不会同时启动每个 cursor。

我需要为 curi 并行运行 extract_single 以获取相应的 Ti,在此示例中 i 变为 1 到 5。 怎么做? 如何处理以并行运行

您可以使用 Thread 来完成这项工作

这只是一个例子:

from threading import Thread, Lock

class DatabaseWorker(Thread):
    __lock = Lock()

    def __init__(self, db, query, result_queue):
        Thread.__init__(self)
        self.db = db
        self.query = query
        self.result_queue = result_queue

    def run(self):
        result = None
        logging.info("Connecting to database...")
        try:
            conn = connect(host=host, port=port, database=self.db)
            curs = conn.cursor()
            curs.execute(self.query)
            result = curs
            curs.close()
            conn.close()
        except Exception as e:
            logging.error("Unable to access database %s" % str(e))
        self.result_queue.append(result)

delay = 1
result_queue = []
worker1 = DatabaseWorker("db1", "select something from sometable",
        result_queue)
worker2 = DatabaseWorker("db1", "select something from othertable",
        result_queue)
worker1.start()
worker2.start()

# Wait for the job to be done
while len(result_queue) < 2:
    sleep(delay)
job_done = True
worker1.join()
worker2.join()

你可以从这里阅读更多。

https://www.oracle.com/technical-resources/articles/embedded/vasiliev-python-concurrency.html

你可以使用异步。 (文档可以在这里找到)

import asyncio

def background(f):
    def wrapped(*args, **kwargs):
        return asyncio.get_event_loop().run_in_executor(None, f, *args, **kwargs)

    return wrapped

@background
def your_function(argument):
    #code

现在这个 function 将在调用时并行运行,而无需将主程序等待 state。 您也可以使用它来并行化 for 循环。 当调用 for 循环时,虽然循环是顺序的,但每次迭代都会在解释器到达主程序时并行运行。 在您的情况下,只需添加@background签名,即可将 function 包装在后台运行,如下所示:

@background
def extract_single(curlst[y], tempst[x]):
    #function definition

然后,您只需将@background签名添加到 function 定义,即可使用您的代码无需任何修改即可按预期并行运行。

例如:

@background
def your_function(argument):
    time.sleep(5)
    print('function finished for '+str(argument))


for i in range(10):
    your_function(i)


print('loop finished')

这将产生以下 output:

loop finished
function finished for 4
function finished for 8
function finished for 0
function finished for 3
function finished for 6
function finished for 2
function finished for 5
function finished for 7
function finished for 9
function finished for 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM