1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Telegram чат для обсуждения работы JS парсеров и Node.js модулей: https://t.me/a_parser_javascript
  3. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2200+ и мы растем!
    Скрыть объявление

Зависают потоки при работе с async/await

Тема в разделе "Техническая поддержка по JavaScript парсерам", создана пользователем yscheg, 27 апр 2018.

  1. yscheg

    yscheg New Member

    Регистрация:
    28 мар 2018
    Сообщения:
    1
    Симпатии:
    0
    Здравствуйте. В апарсере версии 1.2.178 написал js-парсер, работающий со сторонним nodejs модулем(самописным). Запускается на 300 потоках.
    Очень часто при его работе возникает следующая ситуация: на одном или нескольких потоках парсер перестает работать на строке
    Код:
    await this.foobarService.isValid
    (на логах видно, что доходит до этой строки и дальше не идет).
    Большинство потоков отрабатывают корректно.
    Из-за этой ситуации задание не может завершиться и висит до тех пор, пока его не удалят.

    Подскажите, пожалуйста, по какой причине такое может происходить (ошибка в апарсере либо не совсем правильно написан js) и как это исправить.

    Упрощенный пример кода парсера:
    Код:
    /**
    * Есть разработанный nodejs-модуль FoobarService, который занимается проверкой URL'ов.
    * Проблема возникает при вызове async/await. Подробнее см. код.
    */
    
    const FoobarService = require("foobarservice"); // подключаем сервис
    class Parser {
        constructor() {
            //this.defaultConf = ...
            this.foobarService = FoobarService.create();
        }
    
        async* parse(set, results) {
    
            response = yield* await this.parse2(set);
    
            results.success = response.success;
            return results;
        }
    
        async* parse2(set) {
    
            const result = {success: true};
    
            const url = "https://foobar.ru/a/b/c.html"; // URL
            try {
                // дальше этого места код не выполняется!!!
                // парсинг на этом потоке останаваливается
                const isValid = await this.foobarService.isValid(url); //тут возвращается Promise
    
                if (isValid === true) {
                    return result;
                }
            } catch (e) {
                this.logger.put(e);
            }
    
            const response = yield this.request("GET", requestUrl, {}, {
                parsecodes: this.parsecodes,
                browser: 1,
            });
    
            // выполяется какая-то бизнес-логика...
    
            return result;
        }
    }
    
     
  2. Forbidden

    Forbidden Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    9 мар 2013
    Сообщения:
    3.317
    Симпатии:
    1.780
    Весь вопрос что делает this.foobarService.isValid(url), вызывает ли reject/resolve во всех возможных случаях, если не вызывает по какой то причине то и await будет ждать бесконечно долго
     

Поделиться этой страницей