Python - завершается ли поток демона после основного потока или нет? - PullRequest
0 голосов
/ 02 апреля 2019

Удалите и замените Windows Service через Thread, пока daemon = True.Должно ли это работать или нет?!

Менее года назад я сделал exe-файл Windows Service с Python 2.7 и py2exe и другим exe-файлом, который запускается как поток из той службы, которая заменяет себя новой службой,Программа отлично работает!Тем временем я много читал о Python Threadnig, и теперь я не понимаю, что правильно и почему это вообще работает?!

  1. s_service.exe установлен как служба Windows и запущен.Это работает.
  2. Другой файл: w_update.exe находится в том же каталоге, что и s_service.exe.
  3. В каталоге загрузки находится еще один s_service.exe (назовите его s_service.exe v2.0):
[ProjectPy]
    [Download]
        s_service.exe
    s_service.exe   <--- This one is active as Windows Service
    w_update.exe

Об услуге:

Для краткости предположим, что s_service.exe имеет только одну задачу - запускать w_update.exe в качестве демона каждые 30 секунд.

if (time_is_right):
    t = threading.Thread(target=run_exe, args=["w_update.exe"])
    t.daemon = True # <--------- SEE THIS!
    t.start()

def run_exe(tool):
    proggie = os.path.join(some_path, tool)
    if os.path.exists(proggie):
        process = subprocess.Popen(proggie, stdout=subprocess.PIPE, shell=False, creationflags=0x08000000)
        process.wait()

О программе Updater:

Программа обновления выполняет следующие действия в следующем порядке:

1. Stop the service s_service.exe
2. Wait 5 sec
3. Remove service from Windows
4. Wait 5 sec
5. Move ProjectPy\Download\s_service.exe to ProjectPy\s_service.exe (overwrites old s_service.exe v1.0 with new s_service.exe v2.0)
6. Install service s_service.exe to Windows
7. Wait 5 sec
8. Start service

(фрагмент кода приведен ниже, управляющие структуры опущены)

service_name = "MyPythonService"

print("Stop Service...")
win32serviceutil.StopService(service_name)
time.sleep(5)

print("Remove Service...")
win32serviceutil.RemoveService(service_name)
time.sleep(5)

print("Move: ", download_dir_filename, current_dir_filename)
shutil.move(download_dir_filename, current_dir_filename)

print("Install Service")
win32serviceutil.InstallService(None, service_name, "My Python Service Display Name", startType=win32service.SERVICE_AUTO_START, exeName=current_dir_filename, description=service_description)
time.sleep(5)

print("Start Service")
win32serviceutil.StartService(service_name)

Myвопрос: почему это работает?!

Из различных ресурсов:

  1. Поток может быть помечен как "поток демона".Значение этого флага заключается в том, что вся программа Python завершается, когда остаются только потоки демонов .

  2. Установка thread.daemon = True позволит основной программе завершить работу. Приложения обычно ждут завершения всех дочерних потоков, прежде чем завершить .

  3. Пока поток, не являющийся демоном, блокирует выход основной программы, если они не мертвы.Поток демона запускается, не блокируя выход основной программы.И при выходе из основной программы тоже уничтожаются связанные потоки демона .

  4. Суть потока демона в том, что он продолжается, когда закрывается основной поток .

  5. Поток демона не блокирует выход из основного потока и продолжает работать в фоновом режиме .

  6. Вопрос переполнения стека: поток демона не завершается несмотря на завершение основной программы

  7. https://www.youtube.com/watch?v=OKedlEeBxU8 - " Когда основная программа завершает работу, поток демона также завершается"

  8. Поток демона - это поток, который будет продолжать работать, даже если остальная частьСценарий остановлен .Это означает, что установка для демона потоков значения true будет означать, что он будет продолжать работать после того, как основной поток завершит (или отключится) .

a) Некоторые говорят, чтокогда основной поток завершается - потоки демона также завершаются.

Если это так, то мой поток демона w_update.exe должен быть уничтожен после шага 1. Stop the service s_service.exe или после шага 3. Remove service from Windows и не может перейти к шагу 5.,6. и 8. Но он (пере) устанавливает и (пере) запускает (новый) сервис правильно - все 8 шагов.

b) Некоторые говорят, что поток, который будет продолжать работать, даже если остальная часть скрипта имеетостановлен.

Это мой случай.

Дополнительная информация: Из-за ошибки, однажды у меня возникла проблема на MS Windows Server 2008:

  1. Oneэкземпляр s_service.exe в диспетчере задач и

  2. Более 350 w_update.exe экземпляров (и всех других экземпляров потока демона)

Когда яостановленные s_service.exe все w_update.exe экземпляры (и все остальные экземпляры потока демона) были автоматически удалены,Так что это идет в пользу а) Некоторые говорят, что когда основной поток завершает работу - потоки демона также завершаются.

Я что-то упустил или есть разница в поведении между версиями Python или между ОС Windows?Я озадачен ...

...