Перезапустите скрипт Python из backround_thread

Я потратил некоторое время на поиск правильного кода, но мне не повезло.

У меня ниже сценарий python с фоновым потоком и основной прогой.. Я хочу перезапустить сценарий, как только фоновый поток встречает условие. Надеюсь, вы можете помочь мне с этим. ТИА

С этим сценарием и background_stuff, и "main" работают одновременно.

def background_stuff():
    while True:
        if condition == 'True':
            ### restart the script
t = Thread(target=background_stuff)
t.start()
### main
if __name__ == '__main__':
    while True:
          #do something

1 ответ

Решение

Можете ли вы реструктурировать свой сценарий так?

def main():
    t = Thread(target=background_stuff)
    t.start()
    while True:
        #do something

def background_stuff():
    while True:
        if condition == 'True':
            ### restart the script
#t = Thread(target=background_stuff)
#t.start()
### main
if __name__ == '__main__':
    main()

Вызов main теперь должен создать новый поток, который будет выполнять фоновую работу, и скрипт в основном перезапускается. Единственная проблема заключается в том, что состояние не сбрасывается. Если вам нужно сбросить состояние, вы можете запустить скрипт с нуля, используя:

os.system("yourScript.py -yourargs")

Я не думаю, что это лучшая практика, хотя...

Независимо от того, какое решение вы в конечном итоге используете, вам все равно нужно завершить старый основной цикл. Это можно сделать, установив какой-либо флаг, когда вы "перезапускаете скрипт", а затем периодически проверяете основной флаг на наличие этого флага и выполняете контролируемое отключение, как только этот флаг установлен, или вы можете запустить основной цикл в другом потоке, который Вы можете получить доступ глобально или из другого потока, а затем прекратить его. Просто помните, что принудительное закрытие потока часто не рекомендуется.

Другие вопросы по тегам