| Neon3333 |
20.05.2022 12:30 |
Цитата:
Сообщение от SOLO WARRIOR
Переписываю одного бота на 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
|