python как разобраться с асинхронностью (ошибка: There is no current event loop in thread 'MainThread')
# Класс, который я далее импортирую и вызову асинхронный метод этого класса для получения результата
class Async_Meta_Trader():
"Класс для работы с торговым терминалом и данными: Класс Meta_Trader login и password, server\
данные эти берем в последующем из файла конфигурации json"
def __init__(self, login_user: int, password_user: str, server_user: str):
self.login = login_user
self.password = password_user
self.server = server_user
async def account_info(self) -> pd.DataFrame:
"Метод для получения информации об торговом счете из терминала"
if not mt5.initialize(login=self.login, password=self.password, server=self.server):
logger.warning(f"initialize() failed connecting to account_trader MetaTrader5, error code = {mt5.last_error()}")
else:
print('Подключение к торговому счету успешно')
account_info_dict = mt5.account_info()._asdict()
df = pd.DataFrame(account_info_dict.items(), columns=['Key', 'Value']) # конвертация
return df
import aiocron # для выполнения задач по расписанию
import asyncio
from My_Class_functions import Meta_Trader # импортировал класс в ко-м есть асин.метод account_info
Terminal = Meta_Trader(login_user=012313, password_user="test", server_user="test")
temp_df = asyncio.run(Terminal.account_info()) # получаю результат из асинх. метода, ко-й в далее вызовет ошибку в ниже следующей асин.функции
@aiocron.crontab(('*/1 * * * *')) # декоратор для вызов асин. функции каждую минуту
async def get_test(): # ??? здесь вызывает ошибку There is no current event loop in thread 'MainThread' #
print("run")
await asyncio.sleep(2)
asyncio.get_event_loop().run_forever()
** Как корретно работать с асинхронными методами :(
Ответы (1 шт):
Автор решения: Universall
→ Ссылка
По вопросу могу предположить, что вы не сильно разбираетесь в асинхронном коде, так что вот пример:
import asyncio
class Test:
def __init__(self, num: int):
self.some_num = num
async def some_async_method(self):
await asyncio.sleep(1) # Важно: Асинхронный под не выполняется параллельно. Он выполняется тогда, когда какая-либо функция чего-то ждёт (в данном случае asyncio.sleep(1)) и в этот момент передает управление на другую
print(f"some_async_method num = {self.some_num}")
async def update_data(instance: Test):
while True:
await asyncio.sleep(2)
instance.some_num += 1
async def print_data(instance: Test):
while True:
await instance.some_async_method()
async def main():
instance = Test(10)
tasks = [asyncio.create_task(print_data(instance)), asyncio.create_task(update_data(instance))] # Создание задач для выполнения в event loop
await asyncio.wait(tasks) # Можно просто ожидать конца выполнения функций (в этом случае вечность)
# await asyncio.sleep(100) Или настроить время, которое будет работать скрипт. Если убрать sleep, то python запустит 2 таска и продолжит выполнять код ниже, а так как его нету - просто выйдет из приложения
# Или вообще ничего не ждать и выполнять код дальше
if __name__ == '__main__':
asyncio.run(main())
А в вашем коде попробуйте заменить asyncio.get_event_loop() на asyncio.new_event_loop().
Также можете посмотреть это видео по теме.