@Danil_Batrakov

Как написать вызов функции не требующий окончания вызываемой функции?

Создаю СМС сервис на Flask ожидающий на вход json, от main-сервиса после чего сервис обращается по api к железке EASTAR TG800 для отправки СМС. Проблема в том что обращаться к АПИ можно раз в 10 секунд по одному порту, а ответ main-сервису необходимо дать сразу. Написал класс для общения с железкой (после разбора json'а вызываю метод send_message):
class SMS:
    def __init__(self, x):
        self.port = {}
        self.port.update(x)

    async def send_message(self, destination, text):
        for key in self.port:
            if self.port[key]:
                text_of_send = text.replace(' ', '+')
                url = ("http://{host}/cgi/WebCGI?1500101=account={login}&password={passw}&" +
                      "port={port}&destination={dest}&content={txt}").format(
                    host=host,
                    login=login,
                    passw=passw,
                    port=key,
                    dest=destination,
                    txt=text_of_send)
                # requests.get(url)
                print(url)
                # self.count_TF(key)
                await self.count_TF(self, key)
                return key
        print('ничего не активно')
        time.sleep(5)
        k = await self.send_message(destination, text)
        return k

    async def count_TF(self, key):
        self.port[key] = False
        print(f'start {key}')
        # time.sleep(10)
        await asyncio.sleep(10)
        print(f'stop {key}')
        self.port[key] = True

Моя идея заключается в том, чтобы хранить в свойствах словарь port, где хранятся номера портов в виде ключей и True или False в виду значений этих ключей, соответственно если условный 1й порт True - по нему можно отправить сообщение, если False - нельзя. После отправки сообщения по условному порту 1, значение соответствующего ключа меняется на False. После чего необходимо ответить main-сервису. После смены значения ключа "1", в словаре свойства port, на False должна начать выполняться функция count_TF которая ждет 10 секунд, после чего меняет значение обратно на True.
Собственно как написать вызов метода (функции) count_TF так, чтобы программа не ожидала его завершения и выполнялась дальше, успешно ответила main-сервису?

P.S. Я пока не очень силен в программировании, а все мои попытки использования asyncio и threading не окончились ничем полезным, не особо понимаю как в моем случае их правильно использовать
  • Вопрос задан
  • 49 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AlbertForest
await self.count_TF(self, key)
замени на
asyncio.create_task(self.count_TF(self, key))

time.sleep(5)
замени на
await asyncio.sleep(5)

и вместо k = await self.send_message(destination, text)
я бы сделал
while True:
    for key in self.port:

Не вижу смысла делать рекурсию там где можно обойтись без нее
Ответ написан
@Danil_Batrakov Автор вопроса
Может быть кому-то будет полезно)

Почему-то не получилось решить мою проблему предложенным выше вариантом, однако, я решил ее следующим образом:

Осуществил вызов метода count_TF тупо вторым потоком:
thread = threading.Thread(target=self.count_TF, args=(key))
thread.start()

При этом убрав из count_TF все упоминания asyncio.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы