Python ThreadPoolExecutor завершает все потоки - PullRequest
1 голос
/ 19 июня 2020

Я запускаю фрагмент кода python, в котором несколько потоков выполняются через исполнитель пула потоков. Каждый поток должен выполнять задачу (например, получить веб-страницу). Я хочу иметь возможность завершить все потоки, даже если один из потоков не сработает. Например:

with ThreadPoolExecutor(self._num_threads) as executor:
    jobs = []
    for path in paths:
        kw = {"path": path}
        jobs.append(executor.submit(start,**kw))
    for job in futures.as_completed(jobs):
        result = job.result()
        print(result)
def start(*args,**kwargs):
    #fetch the page
    if(success):
        return True
    else:
        #Signal all threads to stop

Возможно ли это сделать? Результаты, возвращаемые потоками, бесполезны для меня, если все они не будут успешными, поэтому, если хотя бы один из них выйдет из строя, я хотел бы сэкономить некоторое время на выполнение остальных потоков и немедленно их завершить. Фактический код, очевидно, выполняет относительно длинные задачи с парой точек отказа.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Если вы закончили с потоками и хотите изучить процессы, то этот кусок кода здесь выглядит очень многообещающим и простым, почти такой же синтаксис, что и поток, но с модулем многопроцессорности.

Когда время ожидания флаг истекает процесс завершен, очень удобно.

import multiprocessing

def get_page(*args, **kwargs):
    # your web page downloading code goes here

def start_get_page(timeout, *args, **kwargs):
    p = multiprocessing.Process(target=get_page, args=args, kwargs=kwargs)
    p.start()
    p.join(timeout)
    if p.is_alive():
        # stop the downloading 'thread'
        p.terminate()
        # and then do any post-error processing here

if __name__ == "__main__":
    start_get_page(timeout, *args, **kwargs)
0 голосов
/ 21 июня 2020

Вы можете попробовать использовать StoppableThread из fun c -timeout . Но завершать потоки категорически не рекомендуется. И если вам нужно убить поток, у вас, вероятно, проблема с дизайном. Посмотрите на альтернативы: asyncio сопрограммы и multiprocessing с законной функцией отмены / завершения.

...