Exchange Sync для цикла к асинхронному подходу? - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть этот код, в котором я пытаюсь кэшировать необходимую память, прежде чем использовать ее для выполнения HTTP-запросов с библиотекой.Я кеширую их раньше, чтобы сделать код быстрее, когда он действительно выполняет запросы, которые очень важны для максимально быстрой работы.

Код работает, но теперь он выполняет запросы "синхронно".

Я полагаю, код проблемы находится ниже:

for (i = 0; i < exchanges.length; i++)

Я не уверен, каков наилучший / быстрый подход к выполнению вышеуказанного для асинхронного цикла?

'use strict';
const ccxt = require('ccxt');
const fs = require('fs');
const path = require('path');

//Cache some memories first
var exchangesArray = [];
var exchangesArray2 = [];
(async () => {
  const allexchanges = ccxt.exchanges.filter((id) => !['coinmarketcap', 'theocean'].includes(id))
        .map(async (id) => {
            const Exchange = ccxt[id];
            const exchange = new Exchange({ enableRateLimit: true });
            if (exchange.has['fetchTickers']) {

                exchangesArray.push(exchange);
                exchangesArray2.push(id);
            }
        });

    await Promise.all(allexchanges);
})();



//The cached memories
const exchanges = exchangesArray; //Holds exchanges object
const exchangesnames = exchangesArray2; //Holds exchanges name
var i;

//Use cached memories to do the "fetchTickers()" as fast as possible now
(async () => {
    console.log(`start`);
    const start = Date.now();


    //What is the fastest way to make this for loop async/await to run in parallel?
    for (i = 0; i < exchanges.length; i++) {

        // pop one exchange from the array
        const exchange = exchanges[i]
        const exchangename = exchangesnames[i]

        try {
            const tickers = await exchange.fetchTickers();
            const dumpFile = path.join(__dirname, 'tickers', `${exchangename}Tickers.json`);
            await fs.promises.writeFile(dumpFile, JSON.stringify(tickers));
        } catch (e) {
            console.error(e);
        }
    }


    // wait for all of them to execute or fail
    await Promise.all(exchanges)


    const end = Date.now();
    console.log(`Done in ${(end - start) / 1000} seconds`);
})();

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Попробуй это.По сути, вы создаете массив обещаний для каждой операции, чтобы сохранить ваши тикеры.Затем используйте Promise.all, чтобы дождаться разрешения всех процессов тикера.

//What is the fastest way to make this for loop async/await to run in parallel?
    var tickersPromises = []
    for (i = 0; i < exchanges.length; i++) {

        // pop one exchange from the array
        const exchange = exchanges[i]
        const exchangename = exchangesnames[i]

        try {
            let tickerProcessing = new Promise(async (resolve) => {
                // probably do a try catch in here
                const tickers = await exchange.fetchTickers();
                const dumpFile = path.join(__dirname, 'tickers', `${exchangename}Tickers.json`);
                await fs.promises.writeFile(dumpFile, JSON.stringify(tickers));
                resolve()
            })
            tickersPromises.push(tickerProcessing)

        } catch (e) {
            console.error(e);
        }
    }


    // wait for all of them to execute or fail
    await Promise.all(tickersPromises)

С высокого уровня, если вы действительно хотите сделать этот код быстрее, прекратите запись ответа в файл и сохраните его впамять, используя объект или словарь библиотеки.Тем не менее, задержка в сети будет самой медленной.

Полагаю, это криптообмен.Имейте в виду, что тикеры часто задерживаются на крипто-обменах при использовании API REST.Вам лучше использовать интерфейс веб-сокета, который многие биржи предлагают, чтобы вы получили самую последнюю информацию о тикере, как только она станет доступна, чтобы минимизировать задержку.

0 голосов
/ 23 февраля 2019

Взгляните на синтаксис for await...of.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...