【问题标题】:Python concurrent.futures calling same function twicePython concurrent.futures 两次调用相同的函数
【发布时间】:2016-07-31 03:56:00
【问题描述】:

如果我的所有进程都是从不同的函数启动的,那么使用 concurrent.futures 没有问题。但是,如果我想用不同的参数调用同一个函数,我似乎无法获得正确的语法。这是我到目前为止得到的,但它不起作用:

tasks = ((serial_port_local, serial_options_local, serial_port_remote, serial_options_remote, "local"),
(serial_port_remote, serial_options_remote, serial_port_local, serial_options_local, "remote"))

for task in zip(tasks, executor.map(serial_cross_over, tasks)):
    print (task)

这是错误,但我不明白:

TypeError: serial_cross_over() missing 4 required positional arguments: 'receive_serial_options', 'send_serial_port', 'send_serial_options', and 'source'

实际上,我完全不明白为什么它很复杂。我不应该只是能够做到吗:

executor.submit(some_function(parameter1))
executor.submit(some_function(parameter2))

但这不起作用。程序在第二次提交时挂起。为什么?

【问题讨论】:

    标签: python concurrent-programming


    【解决方案1】:

    serial_cross_over 似乎需要 4 个参数(如果我错了,请纠正我),而你在 .map 时没有提供它们, 也许看看这个答案:Pass multiple parameters to concurrent.futures.Executor.map?

    tasks = ((serial_port_local, serial_options_local, serial_port_remote, serial_options_remote, "local"), (serial_port_remote, serial_options_remote, serial_port_local, serial_options_local, "remote"))
    
    for task in zip(executor.map(lambda p: f(*p), tasks)):
        pass
    

    至于为什么 executor.submit 没有按预期工作,我不能说没有更多细节。你试过这样吗?:

    with ThreadPoolExecutor(max_workers=1) as executor:
        future = executor.submit(some_function, parameter1)
        print(future.result())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多