我不理解Python concurrent.futures

时间:2018-03-14 09:20:26

标签: python multithreading python-3.x python-multithreading concurrent.futures

我尝试使用多线程执行def do_stuff_parallel(par1, par2, par3, par4, par5): print("test1") print(str(par1)) print("test2") if(.. == ".."): ... with ThreadPoolExecutor(max_workers=4) as executor: futures = set() for LinkedConnector in FuncGroupTask.Connectors: f = executor.submit(do_stuff_parallel, par1, par2, par3, par4, par5) futures.add(f) 函数。

do_stuff_parallel

每次需要同时使用5个参数执行do_stuff_parallel函数。

现在它进入https://example.com/index.php?/discover/方法,但它只打印" test1"从不par1或" test2。

1 个答案:

答案 0 :(得分:2)

你这样做有点不对劲。 Executor.map()将列表中的每个项目映射到工作人员,您将获得例外。您的函数需要五个参数,但您只发送一个参数。使用concurrent.futures时,异常会存储在将来,并且只有在尝试检索结果时才会引发异常。这将显示例外情况:

def do_stuff_parallel(par1, par2, par3, par4, par5):
    print("function entered")


par1=par2=par3=par4=par5 = 42

with ThreadPoolExecutor(max_workers=4) as executor:
    for _ in range(1,10):
        f = executor.map(do_stuff_parallel, [par1, par2, par3, par4, par5])
        for q in f:
            print(q)

结果:

TypeError: do_stuff_parallel() missing 4 required positional arguments: 'par2', 'par3', 'par4', and 'par5'

你需要提供一个元组,然后在你的函数中解压缩它:

def do_stuff_parallel(args):
    print(args)
    return(42)


par1=par2=par3=par4=par5 = 43

with ThreadPoolExecutor(max_workers=4) as executor:
    for _ in range(1,10):
        f = executor.map(do_stuff_parallel, [(5,6,7,8,9),(3,4,5,6,7)])
        for q in f:
            print(q)

现在你可以像args [0],args [1]等那样访问你的参数。如果你不能改变worker函数接口,你可以创建一个包装器,代理工作者调用真正的worker:

def proxy_worker(args):
    return real_worker(args[0], args[1] ....)

当然,如果您不打算映射任何内容,请使用executor.submit()代替map()。如果您打算多次启动工作程序,这将允许您发送多个参数。 Map用作帮助器将迭代器映射到worker,你可能根本不需要它。

使用executor.submit(),您可以按原样保留界面:

def do_stuff_parallel(a,b,c,d,e):
    print(a)
    return(42)

with ThreadPoolExecutor(max_workers=4) as executor:
    futures = set()
    for _ in range(1,10):
        f = executor.submit(do_stuff_parallel, par1, par2, par3, par4, par5)
        futures.add(f)