多线程 - 如何在 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 中的线程调用期间控制函数的打印语句的主要内容,如果未能解决你的问题,请参考以下文章

qt多线程中怎样锁定一个指定的变量?

C ++多线程避免函数调用期间的交错

python-多线程:调用thread模块中的start_new_thread()函数来产生新线程

Python中的多线程如何正确运用?案例详解

Python中的多线程如何正确运用?案例详解

python之多线程原理