当event_loop已经运行时,等待类内部的协同程序

时间:2018-03-20 12:34:14

标签: python-3.x python-asyncio

我有一个关于asyncio的问题我真的无法让我知道。

采用这个工作示例(因为字符串插值,使用Python 3.6+)

import asyncio
import aiohttp
import async_timeout
import json


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


async def get_bittrex_marketsummary(currency_pair):
    url = f'https://bittrex.com/api/v1.1/public/getmarketsummary?market={currency_pair}'
    async with aiohttp.ClientSession() as session:
        response = await fetch(session, url)
    return json.loads(response)


class MyCryptoCurrency:
    def __init__(self):
        self.currency = "BTC-ETH"
        self.last_price = None
        asyncio.ensure_future(self.get_last_price())

    async def get_last_price(self):
        self.last_price = await get_bittrex_marketsummary(self.currency)


async def main():
    eth = MyCryptoCurrency()
    print(eth.last_price)

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

虽然它运行并且不会抛出任何异常,但它不会从api请求中获得结果,因此......不起作用:P

如果我尝试使用f.e. loop.run_until_complete(get_bittrex_marketsummary())我得到“事件循环已经在运行”错误 - 哪种有意义。

任何提示如何正确解决这个问题?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

好的,在freenode上的#python频道讨论了这个之后我得到了答案“不要在device/exception中做异步I / O”,所以这是工作版本:

__init__