"RuntimeError: этот цикл событий уже запущен"; отладка aiohttp, asyncio и IDE "spyder3" в python 3.6.5 - PullRequest
0 голосов
/ 09 мая 2018

Я изо всех сил пытаюсь понять, почему я получаю сообщение об ошибке «RuntimeError: Этот цикл событий уже выполняется».Я попытался запустить фрагменты кода из "https://aiohttp.readthedocs.io/en/stable/", однако, я продолжаю получать ту же проблему.

Фрагмент кода из учебника:


import aiohttp
import asyncio
import async_timeout

async def fetch(session, url):
    async with async_timeout.timeout(10):
        async with session.get(url) as response:
            return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

РЕЗУЛЬТАТЫ из фрагмента учебника (при выполнении кода из IDE spyder):


RuntimeError: Этот цикл событий уже выполняется

<!doctype html>"

... (подробнее html)


Фрагмент личного кода (не из приведенного выше руководства):


import aiohttp
import asyncio
import time

urls = ['https://api.robinhood.com/quotes/c4f6720a-0364-4e7b-8c41-705696759e1a/']

async def fetch(client, url):
    async with client.request('get', url) as response:
        if response.status == 200:
            data = await response.text()
        else:
            data = []
        print(data)
        return(data)

async def get_async_urls(urls):
    async with aiohttp.ClientSession() as client:
        return await asyncio.gather(*(fetch(client, url) for url in urls))

if __name__ == '__main__':
    t0 = time.time()
    loop = asyncio.get_event_loop()
    results = loop.run_until_complete(get_async_urls(urls))
    print(results)
    t1 = time.time()
    total_time = t1-t0
    loop.close()

РЕЗУЛЬТАТЫ из личного фрагмента (при выполнении кода из IDE spyder):


RuntimeError: Этот цикл событий уже выполняется

{"ask_price": "14.9000», "ask_size": 100, "bid_price": "14,0100", "bid_size": 100, "last_trade_price": "14,7900", "last_extended_hours_trade_price": "14,7900", "previous_close": "14,3600", "adjusted_previous_close":"14,3600", "previous_close_date": "2018-05-07", "символ": "SURF", "trading_halted" ложь "has_traded": правда, "last_trade_price_source": "консолидированное", "вверхdated_at ":" 2018-05-08T20: 01: 21Z "," instrument ":" https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/"}


РЕЗУЛЬТАТЫ из личного фрагмента (при запуске из cmd "python personal_snippet.py"):


{"ask_price": "14.9000", "ask_size": 100, "bid_price": "14.0100", "bid_size": 100, "last_trade_price": "14.7900", "last_extended_hours_trade_price": "14,7900", "previous_close": "14,3600", "adjusted_previous_close": "14,3600", "previous_close_date": "2018-05-07", "символ": "ПРИБОЙ", "trading_halted" ложь, "has_traded": true, "last_trade_price_source": "консолидированный", "updated_at": "2018-05-08T20: 01: 21Z", "instrument": "https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/"} ['{" ask_price ":"14,9000" , "ask_size": 100, "bid_price": "14.0100", "bid_size": 100, "last_trade_price": "14.7900", "last_extended_hours_trade_price": "14.7900", "previous_close": "14,3600", "adjusted_previous_close": "14,3600", "previous_close_date": "2018-05-07", "символ": "SURF", "trading_halted" ложь "has_traded": правда, "last_trade_price_source": "сводный", "updated_at":»2018-05-08T20: 01: 21Z " "инструмент":" https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/"}']


Представленные выше результаты указывают на то, что проблема связана с IDE Spyder.


У меня два вопроса:

  1. Почему я получаю эту ошибку? Кажется, что другие люди не получают эту ошибку при запуске учебного кода.(Возможный ответ: ВОЗМОЖНАЯ ОШИБКА В SPYDER3)

    Это, кажется, происходит только в IDE spyder.Я запустил оба фрагмента кода из командной строки cmd, но ошибки не возникло.Спасибо @MikhailGerasimov за предложение.

  2. Учитывая, что у меня есть две команды печати (во втором фрагменте кода) и что был напечатан только один набор "данных",затем почему данные не возвращаются к исходному вызову (results = loop.run_until_complete (get_async_urls (urls))) * (потенциальный ответ: возможная ошибка в SPYDER3)

    Это кажетсяслучиться только в шпионе IDE.Я запустил второй фрагмент кода из командной строки cmd, и оба отпечатка появились.Спасибо @MikhailGerasimov за предложение.




ОБА ВОПРОСЫ (вероятно) были даны ответы.Я буду ссылаться на этот вопрос, когда отправляю проблему в IDE spyder.Я буду продолжать обновлять это, поскольку вещи развиваются на стороне шпиона вещей.Если они вернутся и скажут, что проблема не в них, тогда я снова открою вопросы в несколько ином формате.

Спасибо за помощь!




Ссылка на ссылку на указанную проблему в github Spyder IDE: https://github.com/spyder-ide/spyder/issues/7096




Ответы [ 3 ]

0 голосов
/ 15 июня 2018

Возможно, мне повезло, но я понизил рейтинг Торнадо. См. «Невозможно вызвать asyncio event_loop после обновления торнадо 5.0»

0 голосов
/ 23 декабря 2018

У меня та же проблема со Spyder. Единственное решение, которое мне помогло, это использовать nest_asyncio

установить nest_asyncio с помощью команды

pip install nest_asyncio

Добавьте следующие строки в ваш файл

import nest_asyncio
nest_asyncio.apply()

И проблема должна быть исправлена.


Из документов

По замыслу asyncio не позволяетего цикл событий должен быть вложенным.Это создает практическую проблему: когда в среде, где цикл обработки событий уже запущен, невозможно запускать задачи и ждать результата.Попытка сделать это приведет к ошибке «RuntimeError: этот цикл событий уже запущен».

Эта проблема возникает в различных средах, таких как веб-серверы, приложения с графическим интерфейсом и ноутбуки Jupyter.

Этот модуль исправляет asyncio, чтобы разрешить вложенное использование asyncio.run и loop.run_until_complete.

0 голосов
/ 10 мая 2018

Проблема связана с используемой IDE (Spyder3). Я пытался запустить код с PyCharm Community Edition прошлой ночью. Код работает без проблем.

Я отправил сообщение об ошибке Spyder3.

...