mirror of
https://github.com/lnbits/lnbits.git
synced 2025-09-19 20:14:59 +02:00
fix: revert some changes from last commit
Reintroduced the controller which canceles remaining requests once two results are received.
This commit is contained in:
@@ -220,6 +220,26 @@ async def btc_price(currency: str) -> float:
|
|||||||
"to": currency.lower(),
|
"to": currency.lower(),
|
||||||
}
|
}
|
||||||
rates = []
|
rates = []
|
||||||
|
tasks = []
|
||||||
|
|
||||||
|
send_channel = asyncio.Queue()
|
||||||
|
|
||||||
|
async def controller():
|
||||||
|
failures = 0
|
||||||
|
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:
|
||||||
|
for t in tasks: t.cancel()
|
||||||
|
break
|
||||||
|
if failures == len(exchange_rate_providers):
|
||||||
|
for t in tasks: t.cancel()
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
async def fetch_price(provider: Provider):
|
async def fetch_price(provider: Provider):
|
||||||
url = provider.api_url.format(**replacements)
|
url = provider.api_url.format(**replacements)
|
||||||
@@ -229,20 +249,23 @@ async def btc_price(currency: str) -> float:
|
|||||||
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)
|
await send_channel.put(rate)
|
||||||
except Exception:
|
except (httpx.ConnectTimeout, httpx.ConnectError, httpx.ReadTimeout):
|
||||||
pass
|
await send_channel.put(None)
|
||||||
except httpx.ConnectError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
tasks = []
|
|
||||||
for key, provider in exchange_rate_providers.items():
|
asyncio.create_task(controller())
|
||||||
tasks.append(asyncio.create_task(fetch_price(key, provider)))
|
for _, provider in exchange_rate_providers.items():
|
||||||
await asyncio.gather(*tasks)
|
tasks.append(asyncio.create_task(fetch_price(provider)))
|
||||||
|
|
||||||
|
try:
|
||||||
|
await asyncio.gather(*tasks)
|
||||||
|
except asyncio.CancelledError:
|
||||||
|
pass
|
||||||
|
|
||||||
if not rates:
|
if not rates:
|
||||||
return 9999999999
|
return 9999999999
|
||||||
elif rates == 1:
|
elif len(rates) == 1:
|
||||||
print("Warning could only fetch one Bitcoin price.")
|
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)
|
||||||
|
Reference in New Issue
Block a user