Python 3.x Python3 concurrent.futures-并行处理循环

Python 3.x Python3 concurrent.futures-并行处理循环,python-3.x,concurrent.futures,Python 3.x,Concurrent.futures,如果我正确理解了Python 3中的concurrent.futures模块的工作原理,下面的代码: import concurrent.futures import threading # Simple function returning a value def test(i): a = 'Hello World\n' return a def main(): output1 = list() with concurrent.futures.Thre

如果我正确理解了Python 3中的
concurrent.futures
模块的工作原理,下面的代码:

import concurrent.futures
import threading

# Simple function returning a value
def test(i):

    a = 'Hello World\n'
    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 World\n'
                # 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 Scripts\WebGrab Plus\TESTTESTTEST2.py", line 221, in <module>
        main()
      File "G:\HTPC Scripts\WebGrab Plus\TESTTESTTEST2.py", line 209, in main
        for out1 in executor.submit(range(0, 10)):
    TypeError: 'Future' object is not iterable
    
    回溯(最近一次呼叫最后一次):
    文件“G:\HTPC Scripts\WebGrab Plus\test2.py”,第221行,在
    main()
    文件“G:\HTPC Scripts\WebGrab Plus\test2.py”,第209行,在main中
    对于executor.submit中的out1(范围(0,10)):
    TypeError:“Future”对象不可编辑
    
    我需要在代码中修改什么


    谢谢

    无论您是使用
    submit
    还是
    map
    ,都必须始终使用可调用(如函数)作为第一个参数

    Python确实允许嵌套函数(还要注意使用
    Futures
    )的方法


    定义可就地调用的唯一方法是使用
    lambda
    表达式,但这些表达式有很大的局限性。

    我真正想要的是在中并行处理循环,这是什么意思?你能解释更多吗?嗨-所以我不想从0开始,然后依次执行0、1、2、3、4等循环,这样在任何时候都只有一个循环是“活动”的,我希望在不同的线程上同时运行0到10个循环。这有意义吗?嗯
    executor.map
    已经将函数
    test
    同时应用于iterable中的每个元素。仍然不清楚..'但是,我真正想要的是在我的main()函数中并行处理循环,因此:'-对此有什么不清楚的?我不是问测试是否同时通过一个循环。我已经知道它是什么了……为了清楚起见,我要说的是:我不希望在test()中处理并发iterable,我希望在main()中直接处理一个。我该怎么做?任何其他意见/陈述/问题都是对这一点的转移。正如通常在SO上以被动攻击的方式所述,这不是一个代码编写服务。我有一个非常具体的问题需要帮助。。。。
    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()