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

2024-09-28 21:18:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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]);

我认为上面的代码不会并行运行,或者不会同时启动每个游标

我需要运行extract_single parallel for curi,用于对应的Ti,在本例中,我的值是1到5。怎么做? 如何使进程并行运行


Tags: 函数in服务器列表for参数lenextract
2条回答

您可以使用线程来完成此工作

这只是一个例子:

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

您可以使用asyncio。(文件可在here找到)

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

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

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

然后,只需向函数定义中添加@background签名,就可以在不进行任何修改的情况下使用代码并行运行

例如:

@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')

这将产生以下输出:

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

相关问题 更多 >