python线程池问题

python线程池问题

创建10个线程, 然后依次读取线程对象的值

from threading import current_thread as cthread

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor

import time

#func函数没有传入参数

def func():

#print这行里面有i这个变量,但是func并没有传入任何参数,难道不应该在运行到这里的时候报错吗?为何能读取到i的值?

print('thread',i,cthread().ident)

time.sleep(0.5)

return cthread().ident

tp = ThreadPoolExecutor(3)

lst = []

#变量i在这里,为何func函数里面可以读取到?

for i in range(10):

res = tp.submit(func)

lst.append(res)

for i in lst:

print(i.result())

上面这段代码可以正常运行,按照我的理解,在定义func函数的时候并没有传入任何参数,为何func里面调用i变量的时候没报错呢?程序是如何读取到func函数外部的i变量值的?

我改了一下代码,给函数func传入了一个参数a,如下:

from threading import current_thread as cthread

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor

import time

#func函数这次可以传入参数a

def func(a):

#因为传入了参数a,所以这里print可以取到a的值并打印,没问题

print('thread',a,cthread().ident)

time.sleep(0.5)

return cthread().ident

tp = ThreadPoolExecutor(3)

lst = []

for a in range(10):

#这里同步把每次循环的a的值submit到函数func的参数列表里

res = tp.submit(func,a)

lst.append(res)

for i in lst:

print(i.result())

也能正常运行。所以就很不解了,修改后的代码我是能看明白里面的逻辑的,但是之前那个func没有传入参数的一直想不明白函数内部是如何同步读取到函数func外部的值i的。

求助各位大神,万分感谢!
:D


回答:

因为变量 i 是全局变量,如果你把它放到一个函数内,就会报错。如

def foo():

tp = ThreadPoolExecutor(3)

lst = []

#变量i在这里,为何func函数里面可以读取到?

for i in range(10):

res = tp.submit(func)

lst.append(res)

for i in lst:

print(f'result: {i.result()}')

foo()

以上是 python线程池问题 的全部内容, 来源链接: utcz.com/a/160691.html

回到顶部