如果我正确理解了Python3中的concurrent.futures
模块是如何工作的,那么下面的代码:
import concurrent.futures
import threading
# Simple function returning a value
def test(i):
a = 'Hello Worldn'
return a
def main():
output1 = list()
with concurrent.futures.ThreadPoolExecutor() as executor:
# psdd iterator to test function
for out1 in executor.map(test, range(0, 10)):
# append returned result
output1.append(out1)
# confirm output
print(output1)
print("Task Executed {}".format(threading.current_thread()))
if __name__ == '__main__':
main()
执行以下功能:
- 将for循环传递给名为
test()
的函数 - 并行处理循环,而不是串行处理
然而,我真正想要的是在我的main()
函数中并行处理循环,如下所示:
import concurrent.futures
import threading
def main():
output1 = list()
with concurrent.futures.ThreadPoolExecutor() as executor:
# psdd iterator to test function
for out1 in executor.submit(range(0, 10)):
a = 'Hello Worldn'
# append returned result
output1.append(a)
# confirm output
print(output1)
print("Task Executed {}".format(threading.current_thread()))
if __name__ == '__main__':
main()
然而,这会产生以下错误:
Traceback (most recent call last):
File "G:HTPC ScriptsWebGrab PlusTESTTESTTEST2.py", line 221, in <module>
main()
File "G:HTPC ScriptsWebGrab PlusTESTTESTTEST2.py", line 209, in main
for out1 in executor.submit(range(0, 10)):
TypeError: 'Future' object is not iterable
我需要修改代码中的哪些内容?
感谢
无论使用submit
还是map
,都必须使用可调用(如函数(作为第一个参数。
Python确实允许嵌套函数(还要注意Futures
的使用方法(;
import concurrent.futures
def main():
def worker(arg):
return str(arg) + ' Hello World!'
with concurrent.futures.ThreadPoolExecutor() as e:
fut = [e.submit(worker, i) for i in range(10)]
for r in concurrent.futures.as_completed(fut):
print(r.result())
if __name__ == '__main__':
main()
定义可就地调用的唯一方法是使用lambda
表达式,但这些方法有很大的局限性。