Ошибка "RuntimeWarning: coroutine 'weather' was never awaited"

Josski Molodoi

Активный
Автор темы
182
83
Переписываю одного бота на aiogram, сам в асинке полный ноль, выходит вот такая ошибка при запуске main.py.
RuntimeWarning: coroutine 'weather' was never awaited

main.py:
from aiogram import executor
from loader import dp
from threads import *
from handlers import *

if __name__ == '__main__':
    threadWeather.start()
    executor.start_polling(dp, skip_updates=True)

loader.py:
from aiogram import Bot, Dispatcher, types
from data import TOKEN

bot = Bot(token=TOKEN, parse_mode="HTML")
dp = Dispatcher(bot)


threads/__init__.py:
from .weather import weather
from threading import Thread

threadWeather = Thread(target=weather, args=("10:56:00",))


threads/weather.py:
from main import bot
from data import admins
from datetime import datetime
from time import sleep

# 12:00:00
async def weather(time: str) -> None:
    time = time.split(":")
    
    while True:
        _ = datetime.now()

        if  _.hour   == int(time[0]) and \
            _.minute == int(time[1]) and \
            _.second == int(time[2]):
            await bot.send_message(admins[0], "Время пришло!")
        sleep(0.25)
 
Решение
Переписываю одного бота на aiogram, сам в асинке полный ноль, выходит вот такая ошибка при запуске main.py.
RuntimeWarning: coroutine 'weather' was never awaited

main.py:
from aiogram import executor
from loader import dp
from threads import *
from handlers import *

if __name__ == '__main__':
    threadWeather.start()
    executor.start_polling(dp, skip_updates=True)

loader.py:
from aiogram import Bot, Dispatcher, types
from data import TOKEN

bot = Bot(token=TOKEN, parse_mode="HTML")
dp = Dispatcher(bot)


threads/__init__.py:
from .weather import weather
from threading import Thread

threadWeather = Thread(target=weather, args=("10:56:00",))


threads/weather.py:
from main import bot
from data import admins
from datetime import datetime
from time import sleep...

Neon3333

Известный
181
71
Переписываю одного бота на aiogram, сам в асинке полный ноль, выходит вот такая ошибка при запуске main.py.
RuntimeWarning: coroutine 'weather' was never awaited

main.py:
from aiogram import executor
from loader import dp
from threads import *
from handlers import *

if __name__ == '__main__':
    threadWeather.start()
    executor.start_polling(dp, skip_updates=True)

loader.py:
from aiogram import Bot, Dispatcher, types
from data import TOKEN

bot = Bot(token=TOKEN, parse_mode="HTML")
dp = Dispatcher(bot)


threads/__init__.py:
from .weather import weather
from threading import Thread

threadWeather = Thread(target=weather, args=("10:56:00",))


threads/weather.py:
from main import bot
from data import admins
from datetime import datetime
from time import sleep

# 12:00:00
async def weather(time: str) -> None:
    time = time.split(":")
  
    while True:
        _ = datetime.now()

        if  _.hour   == int(time[0]) and \
            _.minute == int(time[1]) and \
            _.second == int(time[2]):
            await bot.send_message(admins[0], "Время пришло!")
        sleep(0.25)
Во-первых, не надо использовать никакие "loader" из дебильных примеров, во-вторых, зачем пытаться переписать что-то на асинк, если ты не понимаешь как он работает. Для начала разберись нормально в работе с ним на питоне, а потом берись за это чтоб не писать бредятину такую как ты написал в коде выше.
Потоки никакого отношения не имеют к асинку, вызов асинхронных функций делается через await
_:
await weather('12:00:00')
Но в твоем случае тебе это нужно переделать под таск, который может выполняться в фоне, ибо даже если ты его передашь в кварги executor'a в on_startup, он тебе заблочит весь эвент луп и полинг не запустится. По этому, разбирайся нормально в теме, а потом уже проблемы тут пытайся решать.
А чтоб без велосипедов как у тебя, есть отличное решение для планирования задач - APScheduler