Python Concurrency ThreadPoolExecutor - остановить выполнение, если условие выполнено - PullRequest
1 голос
/ 16 января 2020

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

У меня есть следующая концепция, но она не работает, она просто работает:

import time, sys
from concurrent.futures import ThreadPoolExecutor

data = {"future1": 'blank', "future2": 'blank', "future3": 'blank'}

def function1(n):
   global data #not sure if this is necessary, as it seems to be able to access this anyway?
   print(n)
   time.sleep(1)
   data['future1'] = n

def function2(n):
   global data
   print(n)
   time.sleep(2)
   data['future2'] = n

def function3(n):
   global data
   print(n)
   time.sleep(3)
   data['future3'] = n

with ThreadPoolExecutor(max_workers=4) as executor:
  while True:
    future1=executor.submit(function1, 'test1')
    future2=executor.submit(function2, 'test2')
    future3=executor.submit(function3, 'test3')

    if data['future2']!='blank':
      executor.shutdown(wait=False)
      sys.exit()

Не уверен, что я делаю не так, любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Вот полный ответ, получается, что executor.shutdown(wait=False) - это не путь к go, как упомянул Сачин. Полный кредит на https://gist.github.com/clchiou/f2608cbe54403edb0b13

import time, sys
from concurrent.futures import ThreadPoolExecutor
import concurrent.futures.thread

data = {"future1": None, "future2": None, "future3": None}

def function1(n):
   time.sleep(1)
   data['future1'] = n
   print(n)

def function2(n):
   time.sleep(2)
   data['future2'] = n
   print(n)

def function3(n):
   time.sleep(3)
   data['future3'] = n
   print(n)

with ThreadPoolExecutor(max_workers=4) as executor:
  executor.submit(function1, 'test1')
  executor.submit(function2, 'test2')
  executor.submit(function3, 'test3')

  while True:
    if any(v is not None for v in data.values()):
      executor._threads.clear()
      concurrent.futures.thread._threads_queues.clear()
      break

print(data)
0 голосов
/ 16 января 2020

Вы запускаете потоки в while True: l oop, который снова и снова инициирует вызовы.

with ThreadPoolExecutor(max_workers=4) as executor:

    future1=executor.submit(function1, 'test1')
    future2=executor.submit(function2, 'test2')
    future3=executor.submit(function3, 'test3')

    while True:
        if data['future2']!='blank':
            executor.shutdown(wait=False)
            sys.exit()

Тем не менее executor.shutdown(wait=False) будет ожидать завершения дочернего процесса

...