Опрос каждые 50 секунд в многопоточной среде

Я использую следующую библиотеку для создания ftp-сервера под названием pyftpdlib.
Следуя точному примеру построения базового ftp-сервера, за исключением того факта, что я создал свой собственный обработчик и передал его, как в примере.

Первый вопрос: мне нужно иметь возможность каждые 50 секунд опрашивать статический словарь (переменную класса), определенный в пользовательском обработчике. После каждого интервала в 50 секунд мне нужно проверять некоторые условия и действовать соответственно.

Как вы, вероятно, видите, пользовательский обработчик используется сервером FTP, я думаю, мне нужен какой-то рабочий поток, который сможет опрашивать статический словарь пользовательского обработчика каждые 50 секунд, как мне запустить другой поток, который будет связан с пользовательский обработчик и делать такой таймер опроса?

Второй вопрос: есть ли какой-то способ узнать, что прошло время 50 секунд (на секунду, которое прошло) с определенной временной отметки, которая была прочитана из статического dict - я хочу сделать это без опроса каждые X секунд, чтобы проверить, прошло время, которое может быть неточным.

1 ответ

Первый вопрос

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

В моем примере "обработчик" должен быть обернут в функцию с мьютексом, чтобы сделать его потокобезопасным

Обратите внимание, что вы можете захотеть добавить мьютекс в пользовательский обработчик, чтобы предотвратить скачки данных и гарантировать, что это потокобезопасно. Код является просто примером, чтобы дать вам идею. Если это не работает как есть. просто дай мне знать.

from threading import Thread
from time import sleep

class Worker(Thread):
    def __init__(self, custom_handler):
        self.handler = custom_handler

    def run(self):
        while(True):
            sleep(50)

            # check handler
            if self.handler:
                # do something
                pass



handler = {}
worker = Worker(handler)

# start thread
worker.run()

Второй вопрос

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

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