Python 3并行处理循环



如果我正确理解了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()

执行以下功能:

  1. 将for循环传递给名为test()的函数
  2. 并行处理循环,而不是串行处理

然而,我真正想要的是在我的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表达式,但这些方法有很大的局限性。

最新更新