我有一个关于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())我得到“事件循环已经在运行”错误 - 哪种有意义。
任何提示如何正确解决这个问题?
提前谢谢!答案 0 :(得分:1)
好的,在freenode上的#python频道讨论了这个之后我得到了答案“不要在device/exception
中做异步I / O”,所以这是工作版本:
__init__