threading.Timer требуется совет - PullRequest
       40

threading.Timer требуется совет

0 голосов
/ 05 августа 2020

Я пытаюсь создать код, который выполняет запланированное резервное копирование, и он должен быть выполнен в какой-то момент в будущем (через 10 секунд в примере), и я хочу, чтобы это повторилось через некоторое время (10 секунд). Я нашел встроенный модуль threading.Time, и он просто останавливается после одного выполнения операции. Я знаю, что это я делаю неправильно, так что помогите мне, пожалуйста

import time
import shutil
from datetime import datetime, timedelta
from threading import Timer

# calculating 
x = datetime.today()
bkup = x.replace(second = x.second) + timedelta(seconds = 10)
delta_t=bkup-x
secs=int(delta_t.total_seconds())

# creating an archive
def backup():
    source = 'D:\py'
    target_dir = 'D:\Backup'

    b = '%Y{0}%m{0}%d{0}%H{0}%M{0}%S'.format('.')
    target = target_dir + os.sep + time.strftime(b)

    a = shutil.make_archive(target, 'zip', target_dir, source)

    if os.system(a) == 0:
        print('Backup success!', target)
    else:
        print('Backup fail')


t = Timer(secs, backup)
t.start()



Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Поместите свой резервный код в отдельный поток, а затем создайте бесконечное while l oop, которое ждет в зависимости от вашего интервала ожидания. Я прикрепил код ниже.

import os
import sys
import shutil
from threading import Thread
import time


class BackupUtil(Thread):
    def __init__(self, interval, src_path, dst_path):
        super().__init__()
        self.interval = interval
        self.src_path = src_path
        self.dst_path = dst_path

    def run(self):
        while True:
            b = '%Y{0}%m{0}%d{0}%H{0}%M{0}%S'.format('.')
            target = self.dst_path + os.sep + time.strftime(b)
            archive = shutil.make_archive(target, 'zip', self.src_path, self.dst_path)

            if os.path.exists(archive):
                print('Backup success!', target)
            else:
                print('Backup failed.')
            time.sleep(self.interval)

if __name__ == '__main__':
    src = sys.argv[1] if os.path.exists(sys.argv[1]) else os.path.join('D', 'py')
    dst = sys.argv[2] if os.path.exists(sys.argv[2]) else os.path.join('D', 'Backup')
    backup = BackupUtil(10, src, dst)
    backup.start()

В качестве альтернативы, если вы используете linux или WSL, вы можете настроить его для работы как cron. Добавьте python shebang в свой сценарий #!/usr/bin/env python3, затем сохраните сценарий резервного копирования примерно как /mnt/c/py/backup_archive. Я предпочитаю удалить расширение .py, чтобы мы могли легко определить, что сценарий предназначен для выполнения. Наконец, убедитесь, что он действительно исполняемый (chmod +x /mnt/c/py/backup_archive или chmod 775 /mnt/c/py/backup_archive).

#!/usr/bin/env python3


import os
import sys
import shutil
from threading import Thread
import time


class BackupUtil(Thread):
    def __init__(self, interval, src_path, dst_path):
        super().__init__()
        self.interval = interval
        self.src_path = src_path
        self.dst_path = dst_path

    def run(self):
        while True:
            b = '%Y{0}%m{0}%d{0}%H{0}%M{0}%S'.format('.')
            target = self.dst_path + os.sep + time.strftime(b)
            archive = shutil.make_archive(target, 'zip', self.src_path, self.dst_path)

            if os.path.exists(archive):
                print('Backup success!', target)
            else:
                print('Backup failed.')
            time.sleep(self.interval)

if __name__ == '__main__':
    src = sys.argv[1] if os.path.exists(sys.argv[1]) else os.path.join('D', 'py')
    dst = sys.argv[2] if os.path.exists(sys.argv[2]) else os.path.join('D', 'Backup')
    backup = BackupUtil(10, src, dst)
    backup.start()

Затем добавьте задание cron для скрипта, установив интервал в 1 минуту (не менее 1 минуты интервалы по умолчанию, тоже не думаю, что это необходимо).

crontab -e
1 * * * * /mnt/c/py/backup_archive arg1 arg2
0 голосов
/ 05 августа 2020

Таймер запускается только один раз. Вы можете:

  • запустить новый таймер после завершения резервного копирования

  • сделать некоторое время l oop в функции таймера

  • начните резервное копирование в вашей операционной системе. В linux это можно сделать с помощью cron job , в windows с помощью планировщика задач

Также см. этот вопрос.

...