python线程池问题
创建10个线程, 然后依次读取线程对象的值
from threading import current_thread as cthreadfrom 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 cthreadfrom 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