fix: fetch btc price function

This commit is contained in:
Stefan Stammberger
2021-10-23 16:41:53 +02:00
parent e532ce1971
commit 7550c968e7

View File

@@ -220,42 +220,30 @@ async def btc_price(currency: str) -> float:
"to": currency.lower(), "to": currency.lower(),
} }
rates = [] rates = []
send_channel = asyncio.Queue(0)
async def controller(nursery): async def fetch_price(provider: Provider):
failures = 0 url = provider.api_url.format(**replacements)
while True:
rate = await send_channel.get()
if rate:
rates.append(rate)
else:
failures += 1
if len(rates) >= 2 or len(rates) == 1 and failures >= 2:
nursery.cancel_scope.cancel()
break
if failures == len(exchange_rate_providers):
nursery.cancel_scope.cancel()
break
async def fetch_price(key: str, provider: Provider):
try: try:
url = provider.api_url.format(**replacements)
async with httpx.AsyncClient() as client: async with httpx.AsyncClient() as client:
r = await client.get(url, timeout=0.5) r = await client.get(url, timeout=0.5)
r.raise_for_status() r.raise_for_status()
data = r.json() data = r.json()
rate = float(provider.getter(data, replacements)) rate = float(provider.getter(data, replacements))
rates.append(rate) rates.append(rate)
await send_channel.put(rate)
except Exception: except Exception:
await send_channel.put(None) pass
except httpx.ConnectError:
pass
# asyncio.create_task(controller, nursery) tasks = []
for key, provider in exchange_rate_providers.items(): for key, provider in exchange_rate_providers.items():
await fetch_price(key, provider) tasks.append(asyncio.create_task(fetch_price(key, provider)))
asyncio.create_task(fetch_price(key, provider)) await asyncio.gather(*tasks)
if not rates: if not rates:
return 9999999999 return 9999999999
elif rates == 1:
print("Warning could only fetch one Bitcoin price.")
return sum([rate for rate in rates]) / len(rates) return sum([rate for rate in rates]) / len(rates)