Kna*_*ing 0 python multithreading python-3.x concurrent.futures
我正在尝试让多线程在我的程序中工作。但是它从不执行我的worker函数functionName。future.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)
并发很难。幸运的是,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。
| 归档时间: |
|
| 查看次数: |
4390 次 |
| 最近记录: |