![](/img/trans.png)
[英]How to always run n processes parallel, without waiting previous n processes to finish?
[英]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.