多线程 - 如何在 python 中的线程调用期间控制函数的打印语句
Posted
技术标签:
【中文标题】多线程 - 如何在 python 中的线程调用期间控制函数的打印语句【英文标题】:multi-threading - How to control print statements from function during thread calls in python 【发布时间】:2021-07-25 06:41:38 【问题描述】:我正在使用 ThreadPoolExecuter 来并行执行打印语句并执行 sql 的函数。我想管理函数中的打印语句。例如
def Func(host,sql):
print ('Executing for %s ' %host)
SQL = Execute(host,SQL) -- connecting to DB
print SQL
main():
sql = 'show databases;'
hostList = ['abc.com','def.com','ghi.com','jkl.com']
with concurrent.futures.ThreadPoolExecutor() as executor:
future = [executor.submit(Func,acct ,host,sql) for host in hostList]
这里对于 hostList 中的 4 个项目,它执行线程并并行执行函数 Func,但打印结果如下所示
Executing for abc.com
Executing for def.com
Executing for ghi.com
Executing for jkl.com
then
SQL output 1
SQL output 2
SQL output 3
SQL output 4
我希望打印的功能如下所示
Executing for abc.com
SQL output 1
Executing for def.com
SQL output 1
Executing for ghi.com
SQL output 1
Executing for jkl.com
SQL output 1
【问题讨论】:
如果您等待输出是这样的,您是否实际上不再是多处理?或者,您是否只是希望将您的打印组合在一起而不反映执行的实际时间? 是的,我希望将我的印刷品组合在一起。 【参考方案1】:如果您只想将打印语句组合在一起而不反映执行所需的暂停,那么您可以执行以下操作。请注意,如果您正在做的唯一事情是单个打印语句,那么您可能不需要锁。
import concurrent.futures
import threading
import random
import time
def Func(account, host, sql, lock):
seconds = random.randint(1, 10)
time.sleep(seconds)
result = "Result of executing \"\" took seconds".format(sql, seconds)
## -------------------------------
## Probably don't need to lock if you combine these into one statement
## -------------------------------
with lock:
print('Executing for %s ' % host)
print("\t\n".format(result))
## -------------------------------
lock = threading.Lock()
hostList = ['abc.com','def.com','ghi.com','jkl.com']
with concurrent.futures.ThreadPoolExecutor() as executor:
future = [executor.submit(Func, "acct" , host, "somesql", lock) for host in hostList]
【讨论】:
“多处理”锁如何与 ThreadPool 一起使用?只需使用普通的threading.Lock 糟糕,你是对的。我虽然这个例子是 ProcessPoolExecutor 而不是 ThreadPoolExecutor。我会更新答案 感谢 JonSg 并感谢他们的帮助。以上是关于多线程 - 如何在 python 中的线程调用期间控制函数的打印语句的主要内容,如果未能解决你的问题,请参考以下文章