将ThreadPoolExecutor返回到任务数组

2024-10-04 11:34:51 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我从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}$

Tags: httpsimportformattasknetmaindefsubmit
1条回答
网友
1楼 · 发布于 2024-10-04 11:34:51

我无法复制您的TypeError;显然您还有一些代码没有展示给我们。正如rocksportrocker在他们的comment中指出的那样,您不能将值赋给还不存在的索引,就像您试图将从executor.submit()返回的future分配给空列表typearr的索引0。这将引发上述IndexError。在

但是,我可以生成一些TypeError,这是因为您错误地调用了submit。在

Executor documentation将参数fn定义为可调用对象,例如函数。现在,当您像这样调用submit时:

executor.submit(task(1,'A'))

在主线程中执行task(1,'A'),然后将其返回值(None)传递给池线程。然后池线程尝试执行None(1, 'A'),并引发一个TypeError: 'NoneType' object is not callable,因为它是在将来包装的。如果您调用task1.result(),您将看到它。在

这意味着,执行任务的是主线程,而不是池线程,从task中的第二个print语句应该可以看到:

^{pr2}$

为了让池线程完成工作,需要将函数对象task传递给executor.submit,如下所示:

^{3}$

输出:

Executing our Task = 1 and A
Executing our Task = 2 and B
MainThread: tasks submitted
Task Executed <Thread(ThreadPoolExecutor-0_0, started daemon 12192)>
Task Executed <Thread(ThreadPoolExecutor-0_1, started daemon 11800)>

相关问题 更多 >