Что-то не получается оседлать asyncio в связке с pyramid. С asyncio знаком ровно пол дня, поэтому вероятно есть какая-то тонкость с event loop. Вот суть проблемы:
Необходимо проверять доступность ресурсов. Доступ к ресурсам может быть как по HTTP так и сокеты. Опять же список ресурсов может быть очень большим, поэтому и решил их опрашивать ассинхронно.
Есть вьюха на пирамиде к которой я обращаюсь:
def collection_get(self) -> dict: plugins = self.db.query(Plugin.filename, Plugin.urlcheck).all() urls = [plugin.urlcheck for plugin in plugins] loop = asyncio.get_event_loop() status = loop.run_until_complete(get_url_status(urls)) return status
И есть к ней контроллер, который и проводит опрос ресурсов:
import asyncio import requests async def get_url_status(urls: list) -> dict: resource_status = await asyncio.gather(*[get_resource_status(url) for url in urls]) return {url: status for url, status in resource_status} async def get_resource_status(url: str) -> tuple: req = requests.request('OPTIONS', url) return url, req.status_code
При попытке обратиться к этой вьюхе выхватываю ошибку: RuntimeError: There is no current event loop in thread ‘waitress’.
С трейслогом:
2019-08-06 11:28:12,620 ERROR [web_if.exceptions.controllers.exceptions:22][waitress] File ".../views/settings/status.py", line 43, in collection_get loop = asyncio.get_event_loop() 2019-08-06 11:28:12,620 ERROR [web_if.exceptions.controllers.exceptions:22][waitress] File "/usr/lib/python3.5/asyncio/events.py", line 671, in get_event_loop return get_event_loop_policy().get_event_loop() 2019-08-06 11:28:12,620 ERROR [web_if.exceptions.controllers.exceptions:22][waitress] File "/usr/lib/python3.5/asyncio/events.py", line 583, in get_event_loop 2019-08-06 11:28:12,620 ERROR [web_if.exceptions.controllers.exceptions:22][waitress] RuntimeError: There is no current event loop in thread 'waitress'.
При этом, если я контроллер запущу, как отдельный скрипт, все работает как-надо:
if __name__ == '__main__': urls = [...] loop = asyncio.get_event_loop() status = loop.run_until_complete(get_uri_status(urls))