Как мне прервать длинную задачу под управлением SCons? - PullRequest
0 голосов
/ 19 апреля 2019

Я использую SCons для управления функцией Python long_task (), которая выполняет длинные вычисления. Если я вызываю long_task () напрямую из скрипта, я могу прервать его с помощью Ctrl-C. Однако, если SCons запускает long_task () и я нажимаю Ctrl-C, тогда long_task () продолжает выполняться до его завершения, и затем SCons говорит: «Сборка прервана. / Сборка прекращена из-за ошибок». Есть ли способ заставить Ctrl-C немедленно остановить long_task () в этой ситуации?

Если я использую обработчик сигнала в long_task () для обработки SIGINT, он ведет себя так, как я хочу, но я бы предпочел не делать этого в каждой из нескольких таких длинных задач. Если я нажму Ctrl- \, то и longtask (), и SCons сразу выйдут, но это выглядит довольно радикально.

Я использую SCons 3.0.1 и Python 3.6.5 под Ubuntu 18.04.

Вот минимальный файл SConstruct:

#!/usr/bin/env python3

import time

def long_task(target, source, env):
    print('Starting long task')
    # Mimic a complex calculation
    for i in range(100):
        time.sleep(0.1)
    print('Finishing long task')

TestBuilder = Builder(action = long_task)

env = Environment(BUILDERS = {'TestBuild': TestBuilder})

env.TestBuild('dummy', [])

1 Ответ

0 голосов
/ 19 апреля 2019

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

Запуск долго работающей логики python внутри SCons ограничит параллельные сборки.

По сути, просто не делайте этого..

(Кстати. Я со-менеджер проекта SCons)

...