Как использовать async-функцию в threading.Timer()?

  • 17 августа 2023 г. 18:16
Ответы на вопрос 2
Для использования асинхронной функции в `threading.Timer()`, вы можете воспользоваться модулем `concurrent.futures`.

Вот пример работы кода:

```python
import threading
import asyncio
from concurrent.futures import ThreadPoolExecutor

# Асинхронная функция, которую вы хотите выполнить
async def do_something(data):
    print(f"Doing something with {data}")
    await asyncio.sleep(1)
    print("Done")

# Функция, которая запускает асинхронную функцию с помощью event loop
def run_async(func, args=()):
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    result = loop.run_until_complete(func(*args))
    loop.close()
    return result

# Функця отправки уведомления
async def send_notification(user_id):
    await asyncio.sleep(1)
    print(f"Sending notification to user {user_id}")

# Функция, которая аннулирует ссылку, выполняет отправку уведомления и устанавливает новый таймер
def cancel_link_and_notify(user_id, link):
    print(f"Cancelling link {link} for user {user_id}")

    # Отправляем уведомление асинхронно
    asyncio.create_task(send_notification(user_id))

    # Получаем текущий event loop
    loop = asyncio.get_event_loop()

    # Запускаем новый таймер после заданного времени
    timer = threading.Timer(5.0, run_async, args=(do_something, (link,)))
    timer.start()

# Пример использования
cancel_link_and_notify(123, "example.com/invite")
Не смешивайте асинхронность и многопоточность в использовании asyncio. Вместо этого в asyncio уже есть методы для отложенного запуска.

Если у вас есть список ссылок, хранящихся в базе данных, я бы рекомендовал создать отдельную задачу с помощью функции create_task(). Эта задача будет периодически выбирать из базы данных истекшие ссылки и отправлять оповещения по ним, а затем удалять их из базы данных. Этот подход позволит сохранить время действия ссылки даже при перезапуске бота.

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