Python中并发。未来的多线程不起作用

Kna*_*ing 0 python multithreading python-3.x concurrent.futures

我正在尝试让多线程在我的程序中工作。但是它从不执行我的worker函数functionNamefuture.done() 总是返回,False并且永远不会打印“已输入功能”文本。

def functionName(par1, par2, par3):
    print("function entered")

with ThreadPoolExecutor(max_workers=2) as executor: 
    for x in items:      #this loops 8000 times
        future = executor.submit(functionName, parameter1, parameter2, parameter3)
        if future.done():
            print("true")
Run Code Online (Sandbox Code Playgroud)

ran*_*mir 6

并发很难。幸运的是,Python的concurrent.futures模块通过期货概念成功地将工人(结果生产者)与主程序(结果消费者)分离了。另外,执行者(线程池或进程池)将为您处理线程/进程生成,同步和联接的所有脏细节。

将作业提交给执行者后,您将来收到的将用于处理结果。使用进行状态的非阻塞检查,future.done()并使用阻塞结果的获取future.result()

结算期货和提供可用结果的确切顺序不确定(除非您正在运行某些实时OS),并且取决于操作系统的线程/进程调度程序。另外,由于您.done()在提交作业后立即进行了检查,因此该作业可能到那时才真正完成。而且,如果您的辅助函数比示例中的复杂,那么很可能不会。当我运行您的示例时,它的完成时间约为50%(true打印了两次)。

但是,要等待并遍历结果,以使结果可用(不一定按提交的顺序),可以使用concurrent.futures.as_completed

例如:

from concurrent.futures import ThreadPoolExecutor, as_completed

def function(param):
    return "function result for param: %s" % param

with ThreadPoolExecutor(max_workers=2) as executor:
    futures = [executor.submit(function, x) for x in [1,2,3]]

for future in as_completed(futures):
    print(future.result())
Run Code Online (Sandbox Code Playgroud)

输出:

function result for param: 1
function result for param: 3
function result for param: 2
Run Code Online (Sandbox Code Playgroud)

另一种方法是提交所有任务,然后遍历所有期货,对所有任务进行阻塞结果获取,以使它们被提交

# submit all
...
# read results in order
for future in futures:
    print(future.result())
Run Code Online (Sandbox Code Playgroud)

但这在某种程度上违背了异步期货的目的。不完全是这样,假设当您将所有8000个任务排入队列时,第一个任务将要完成。但这是很多不必要的假设。使用as_completed