python 3.7.3 - concurent.futures ждут неприятностей - PullRequest
1 голос
/ 21 апреля 2020

Я новичок в python многопоточности, точнее ThreadPoolExecutor, и я здесь, чтобы спросить вас об этом. В настоящее время я работаю с модулем concurrent.futures и застрял в ожидании события. Моя программа go завершает событие ожидания и завершает sh выполнение без вывода окончательных значений каждой возвращаемой функции. Может кто-нибудь объяснить мне, почему, пожалуйста? :)

#!/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))


1 Ответ

0 голосов
/ 22 апреля 2020

Как написано, задача 1 ожидает результата Future для задачи 2, а задача 2 ожидает результата Future для задачи 1. Это типичный тупик .

Посмотрите документацию для Future.result() (выделено мной):

Если время ожидания не указано или отсутствует, время ожидания не ограничено .

Это означает, что оба Future будут ждать друг друга. Это означает, что ничего не будет напечатано и процесс будет никогда fini sh. : -)

...