Сторожевой пул с бассейном в питоне 3

У меня есть простой сторожевой таймер в Python 3, который перезагружает мой сервер, если что-то идет не так:

import time, os
from multiprocessing import Pool

def watchdog(x):
    time.sleep(x)
    os.system('reboot')

    return

def main():
    while True:
        p = Pool(processes=1)
        p.apply_async(watchdog, (60, ))    # start watchdog with 60s interval

        # here some code thas has a little chance to block permanently...
        # reboot is ok because of many other files running independently 
        # that will get problems too if this one blocks too long and
        # this will reset all together and autostart everything back
        # block is happening 1-2 time a month, mostly within a http-request

        p.terminate()
        p.join()

    return

if __name__ == '__main__':
    main()

p = Pool(processes=1) объявляется каждый раз при запуске цикла while.

Теперь вот вопрос: есть ли более разумный путь?

Если я p.terminate() чтобы предотвратить перезагрузку процесса, пул закрывается для любой другой работы. Или нет ничего плохого в том, чтобы каждый раз объявлять новый пул из-за сборки мусора.

1 ответ

Используйте процесс. Процессы поддерживают все функции, которые вы используете, поэтому вам не нужно создавать пул первого размера. Хотя процессы имеют предупреждение об использовании terminate() метод (поскольку он может повредить каналы, сокеты и блокирующие примитивы), вы не используете ни один из этих элементов и вам не нужно об этом заботиться. (В любом случае, Pool.terminate() вероятно, имеет те же проблемы с трубами и т. д., хотя в нем нет аналогичного предупреждения.)

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