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

阅读 2.2k
1 个回答

因为变量 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()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题