如何在Python中为ThreadPoolExecutor线程指定不同的名称



下面的代码用于创建和运行线程。

from concurrent.futures import ThreadPoolExecutor
import threading

def task(n):
result = 0
i = 0
for i in range(n):
result = result + i
print("I: {}".format(result))
print(f'Thread : {threading.current_thread()} executed with variable {n}')
def main():
executor = ThreadPoolExecutor(max_workers=3)
task1 = executor.submit(task, (10))
task2 = executor.submit(task, (100))
if __name__ == '__main__':
main()

当我在windows 10机器中运行代码时,这是生成的输出:

I: 45
Thread : <Thread(ThreadPoolExecutor-0_0, started daemon 11956)> executed with variable 10
I: 4950
Thread : <Thread(ThreadPoolExecutor-0_0, started daemon 11956)> executed with variable 100
Process finished with exit code 0

正如我们所看到的,这两个线程具有相同的名称。我如何通过给它们起不同的名字来区分它们?这是concurrent.futures类的一个特征吗?

非常感谢您的回答。

来自文档:

3.6版新增:添加thread_name_prefix参数是为了允许用户控制线程。由池创建的工作线程的线程名称,以便于调试。

使用thread_name_prefix参数:

concurrent.forets.ThreadPoolExecutor(max_workers=无,thread_name_prefix=''(

你说:"两个线程具有相同的名称">
这不正确!名称相同,因为两个任务都使用相同的线程:实际上task((会立即退出
为了让两个线程都参与进来,您必须在task((函数中添加一些睡眠。

简单回顾一下:

(1(无睡眠:

from concurrent.futures import ThreadPoolExecutor
import threading
import time
def task(n):
result = 0
i = 0
for i in range(n): result = result + i
print(f'{threading.current_thread().name} with variable {n}: {result}')

executor = ThreadPoolExecutor(max_workers=3)
executor.submit(task, (10))
executor.submit(task, (100))    

在这种情况下,输出将是:

带变量10:45的线程池执行器0_0带变量100:4950 的ThreadPoolExecutor-0_0

(2(在task((中使用睡眠,使函数的时间更长:

from concurrent.futures import ThreadPoolExecutor
import threading
import time
def task(n):
result = 0
i = 0
for i in range(n): result = result + i
time.sleep(.5)
print(f'{threading.current_thread().name} with variable {n}: {result}')
executor = ThreadPoolExecutor(max_workers=3)
executor.submit(task, (10))
executor.submit(task, (100)) 

在这种情况下,输出将是:

带变量10:45的线程池执行器0_0ThreadPoolExecutor-0_1,变量为100:4950

最新更新