У меня есть простой пример потока Python, как показано ниже:
class MyClass(object):
threads = 5
def run_in_threads(self, variable1_list, variable2):
with concurrent.futures.ThreadPoolExecutor(max_workers=threads) as executor:
pool = {executor.submit(self.run, variable1, variable2) for variable1 in variable1_list}
concurrent.futures.wait(pool)
def run(self, variable1, variable2):
t = SingleThread(scf_file_path, variable2)
t.start()
t.join()
class SingleThread(threading.Thread):
def __init__(self, variable1, variable2):
logger.debug("Single thread init.")
threading.Thread.__init__(self)
self.my_variable = my_variable
def run(self):
logger.debug("Single thread started.")
# command = my long methond, e.g. subprocess
p = subprocess.Popen(command)
p.wait()
logger.debug("Single thread ended.")
Проблема в том, что иногда команда подпроцесса застревает, а затем весь процесс останавливается (следующая часть скрипта не может быть запущена).
Не могли бы вы проверить этот фрагмент кода и дать подсказку, как поступить с принудительно уничтожающим потоком, если время достигло предела, например, 1 минута?
Спасибо, @shmee за твой намек. Добавление таймаута в метод subprocess.wait является самым простым решением:
def run(self):
logger.debug("Single thread started.")
# command = my long methond, e.g. subprocess
p = subprocess.Popen(command)
p.wait(timeout=60) # <===
logger.debug("Single thread ended.")
p.wait()
который блокирует. Вместо этого есть цикл while, который опрашивает подпроцесс, а также проверяет время ожидания.Popen.wait
принимает необязательный параметр времени ожидания начиная с Python 3.3.