Проблема с контекстным менеджером пула потоков с методом appy_async?

#python #python-multithreading

Вопрос:

У меня возникли проблемы с потоковым пулом при использовании в качестве контекстного менеджера. Когда я использую метод apply_async и пытаюсь получить результаты с помощью метода get () — он просто зависает.

В предоставленном коде пул потоков используется в качестве контекстного менеджера. Это всегда висит внизу, когда пытаешься получить результаты. Я прокомментировал код, который действительно работает (вариант №2), где я вручную создаю и закрываю пул.

Есть какие-нибудь идеи относительно того, почему он висит?

 import threading import time import random import os import logging from multiprocessing.pool import ThreadPool   glock = threading.Lock()  def run(pause_time, lock=glock):  thread_name = threading.currentThread().name  logging.info(f'attempting lock for thread: {thread_name}')  with lock:  logging.info(f'got lock for thread: {thread_name}')  logging.info(f'pausing {pause_time} seconds for {thread_name}')  time.sleep(pause_time)   logging.info(f'released lock for thread: {thread_name}')   return 'abc'   if __name__ == '__main__':  format = "%(asctime)s: %(message)s"  logging.basicConfig(level=logging.INFO, format=format)   jobs = []  job = None  num_threads = os.cpu_count()   """Optin #1 does not work, the jobs.get() will hang!"""  with ThreadPool(num_threads) as pool:  for i in range(1):  pause_time = random.randint(1,5)  jobs.append(pool.apply_async(run, args=(pause_time,glock)))   """Option #2 works fine! Will need to uncomment"""  # pool = ThreadPool(num_threads)  # for i in range(2):  # pause_time = random.randint(1,5)  # jobs.append(pool.apply_async(run, args=(pause_time,glock)))  # pool.close()    pool.join()  for job in jobs:  job.get()    logging.info('finished')  

Комментарии:

1. Где вы устанавливаете job что-то, что поддерживает .get() ?

2. Я немного обновил код. Удалены некоторые строки, которые могут вызвать путаницу. У меня также был цикл for, который использовал » res «для каждого задания в массиве заданий (который я изменил на «задание»). Это зависает работа.get ().