python - 我不明白Python并发.futures

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

我正在尝试使用多线程执行 do_stuff_parallel 函数。

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 方法,但它只打印“test1”,而从不打印 par1 或“test2”。

最佳答案

你这样做有点不对。 Executor.map() 将列表中的每一项映射到工作线程,并且您会遇到异常。您的函数需要五个参数,但您只发送一个。对于并发。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] 等方式访问参数。如果您无法更改工作程序函数接口(interface),您可以创建一个包装器,您的代理工作程序将在其中调用真正的工作程序:

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

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

使用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)

关于python - 我不明白Python并发.futures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49273773/

相关文章:

python - 如何使用 bool 行的二维数组来过滤另一个二维数组?

python - pandas to_csv 创建空的、未指定的文件

C++ 专用互斥锁访问

python-3.x - 使用influxdb-python的Influxdb批量插入

python - Polars 将 pl.Object 转换为 pl.Utf8 : polars. 异常。ComputeError:无法转换 'Object' 类型

python - 字典键用字典值替换 pandas 数据框列中的字符串并执行评估

java - 如何从 map 中获取数据?

java - 停止/终止可运行线程 - 启动新的可运行线程 - Java

python - 如何在 sklearn 中使用分层交叉验证处理多类

python - 为什么在 Python 中从不同路径调用类时 __class__ 不同?