mirror of
https://github.com/discountry/ritmex-bot.git
synced 2026-09-10 08:48:07 +00:00
78 lines
2.1 KiB
Markdown
78 lines
2.1 KiB
Markdown
- [Async Gather Concurrency](./examples/py/)
|
|
|
|
|
|
```python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import asyncio
|
|
import os
|
|
import sys
|
|
|
|
|
|
import ccxt.async_support as ccxt # noqa: E402
|
|
|
|
|
|
async def work(exchange_id):
|
|
|
|
# create it once per program lifetime
|
|
exchange = getattr(ccxt, exchange_id)()
|
|
|
|
print(exchange_id, 'loaded')
|
|
|
|
try:
|
|
|
|
# load markets once, first and foremost
|
|
# https://github.com/ccxt/ccxt/wiki/Manual#loading-markets
|
|
await exchange.load_markets()
|
|
|
|
# use the same exchange instance to iterate over loaded symbols
|
|
# https://github.com/ccxt/ccxt/wiki/Manual#symbols-and-market-ids
|
|
|
|
for symbol in exchange.symbols:
|
|
|
|
try:
|
|
|
|
# fetch the orderbook for each next symbol
|
|
orderbook = await exchange.fetch_order_book(symbol)
|
|
|
|
# ADD YOUR SUCCESS HANDLING HERE
|
|
print(exchange_id, 'fetched', symbol, 'orderbook')
|
|
|
|
except Exception as e:
|
|
|
|
# ADD YOUR ERROR HANDLING HERE
|
|
# https://github.com/ccxt/ccxt/wiki/Manual#error-handling
|
|
print(exchange_id, 'could not fetch', symbol, 'orderbook:', type(e).__name__)
|
|
|
|
except Exception as e:
|
|
|
|
# ADD YOUR ERROR HANDLING HERE
|
|
print(exchange_id, 'could not load markets:', type(e).__name__)
|
|
|
|
# when you're done, don't forget to close the exchange instance properly
|
|
# otherwise you will get "Unclosed client session" exception
|
|
await exchange.close()
|
|
|
|
|
|
async def main():
|
|
|
|
# https://stackoverflow.com/questions/48483348/limited-concurrency-with-asyncio
|
|
max_concurrency = 5 # how many exchanges at once
|
|
|
|
tasks = set()
|
|
loop = asyncio.get_running_loop()
|
|
# loop over all exchanges
|
|
for exchange_id in ccxt.exchanges:
|
|
|
|
# wait for some exchange to finish before adding a new one
|
|
if len(tasks) >= max_concurrency:
|
|
_done, tasks = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
|
|
tasks.add(loop.create_task(work(exchange_id)))
|
|
|
|
# wait for the remaining exchanges to finish
|
|
await asyncio.wait(tasks)
|
|
|
|
|
|
asyncio.run(main())
|
|
|
|
``` |