Как отключить подпроцесс в Python

1

У меня есть простой пример потока 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 минута?

  • 0
    Не используйте p.wait() который блокирует. Вместо этого есть цикл while, который опрашивает подпроцесс, а также проверяет время ожидания.
  • 1
    Popen.wait принимает необязательный параметр времени ожидания начиная с Python 3.3.
Показать ещё 3 комментария
Теги:
multithreading
python-multithreading

1 ответ

0

Спасибо, @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.")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню