Python3.7.3-concurent.futures等待故障
我是python多线程(更准确地说是ThreadPoolExecutor)的初学者,我在这里向您询问这方面的问题。我目前正在使用concurrent.futures模块,我一直在等待事件。我的程序会检查等待事件,并在不打印返回的每个函数的最终值的情况下完成执行。有人能解释一下为什么吗?:)Python3.7.3-concurent.futures等待故障,python,python-3.x,concurrent.futures,Python,Python 3.x,Concurrent.futures,我是python多线程(更准确地说是ThreadPoolExecutor)的初学者,我在这里向您询问这方面的问题。我目前正在使用concurrent.futures模块,我一直在等待事件。我的程序会检查等待事件,并在不打印返回的每个函数的最终值的情况下完成执行。有人能解释一下为什么吗?:) 如前所述,任务1正在等待任务2的未来结果,而任务2正在等待任务1的未来结果。这是一个典型的例子 查看Future.result()的文档(重点是我的): 如果未指定超时或无超时,则等待时间没有限制 这意味着两
如前所述,任务1正在等待任务2的未来结果,而任务2正在等待任务1的未来结果。这是一个典型的例子 查看
Future.result()
的文档(重点是我的):
如果未指定超时或无超时,则等待时间没有限制
这意味着两个未来的将继续彼此等待。这意味着不会打印任何内容,并且该过程永远不会完成。:-) 在
function_AB
中,您正在等待通过在不同线程中运行function_AB
创建的未来结果。这是故意的吗?如果我正确阅读了文档,那就永远不会结束。事实上,我有点惊讶它没有爆炸……不,不是的,我只是在测试一些东西,以便更好地理解result()是如何工作的。问题是如果我尝试使用“”def function_AB():print(“execution A_B”)time.sleep(10)resultat_cd=Task_2.result()print(type(resultat_cd))print(“blabla”)返回结果\u ab''结果是相同的,它没有按照我的意愿显示或打印其余的代码,如“finish C\u D”,我不知道为什么。感谢您的回答,因此当我更改超时时出现异常,“name'Task_2'未定义”,那么,是可以等待来自另一个线程的程序执行,还是只能等待main()函数的结果呢?这些示例线程所做的工作很少。可能是任务1在创建任务2之前已在运行,导致上述错误。这表明在另一个未来
内部等待一个未来
很容易导致不同类型的问题。如果查看concurrent.futures.Executor
的设计,等待Future
的结果通常在主线程或进程中完成。
#!/usr/bin/env python
# module principal utilise concurent.futures pour executer 2 tacheds en parallele
from concurrent.futures import ThreadPoolExecutor
import shutil
import time
import threading
def function_AB():
print("execution A_B")
time.sleep(10)
result_ab = "finish A_B"
resultat_cd = Task_2.result(None)
print(resultat_cd)
return result_ab
def function_CD():
print("execution C_D")
time.sleep(3)
result_cd = "finish C_D"
resultat_ab = Task_1.result()
print(resultat_ab)
return result_cd
def main():
executor = ThreadPoolExecutor(max_workers=2)
#submit = ne ferme pas explictement le pool comparer au with ThreadPoolExecutor() /
# appel non bloquant programme principal traite l'impression de la déclaration immédiatement et se bloque jusqu'à ce que tous les threads aient terminé
Task_1 = executor.submit(function_AB)
Task_2 = executor.submit(function_CD)
print(Task_1)
print(Task_2)
#permet de bloquer les threads jusqu'à la fin de leur exécution
executor.shutdown(wait=True)
if __name__ == "__main__":
start = time.time()
main()
print("Temps execution : {}".format(time.time() - start))