下面是我从https://tutorialedge.net/python/concurrency/python-threadpoolexecutor-tutorial/获得的示例代码
from concurrent.futures import ThreadPoolExecutor
import threading
import random
taskarr = []
def task(n,c):
print("Executing our Task = {} and {}".format(n,c))
print("Task Executed {}".format(threading.current_thread()))
def main():
executor = ThreadPoolExecutor(max_workers=3)
task1 = executor.submit(task(1,'A'))
task2 = executor.submit(task(2,'B'))
if __name__ == '__main__':
main()
在这里,如果执行人.提交返回到简单变量task1,它可以工作。但我的要求是把它返回到数组中。所以当我这么做的时候, 任务分配[0]=执行人.提交(任务(1,“A”) 它抛出的错误是
^{pr2}$
我无法复制您的
TypeError
;显然您还有一些代码没有展示给我们。正如rocksportrocker在他们的comment中指出的那样,您不能将值赋给还不存在的索引,就像您试图将从executor.submit()
返回的future分配给空列表typearr
的索引0。这将引发上述IndexError
。在但是,我可以生成一些
TypeError
,这是因为您错误地调用了submit
。在Executor documentation将参数
fn
定义为可调用对象,例如函数。现在,当您像这样调用submit
时:在主线程中执行
task(1,'A')
,然后将其返回值(None
)传递给池线程。然后池线程尝试执行None(1, 'A')
,并引发一个TypeError: 'NoneType' object is not callable
,因为它是在将来包装的。如果您调用task1.result()
,您将看到它。在这意味着,执行任务的是主线程,而不是池线程,从
^{pr2}$task
中的第二个print语句应该可以看到:为了让池线程完成工作,需要将函数对象
^{3}$task
传递给executor.submit
,如下所示:输出:
相关问题 更多 >
编程相关推荐