#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 ().