waLongAction - 4 секунды на ветер?

Добрый день.

Реализуем waLongAction по https://developers.webasyst.ru/cookbook/basics/cla... для тестов сделали в функции step просто увеличение счетчика:

$this->data['offset'] += 1;

и обнаружили что время выполнения заглушки составило 4 секунды!

Посмотрев файл waLongActionController насторожило большое кол-во sleep usleep, залогировали каждый вызов и оказалось что тормозит функции sleep в 733 строке:

Причем поглядели при импорте CSV задержка по данной функции составила всего 1 секунду.

Но скорее всего пост будет просто информационным, так как покопавшим в коде обнаружили что это следствие самого механизма и связано с "недоверием" "локерам" при первом запуске )


9 ответов

  • 1
    info@ravencode.ru 21 января 2018 12:22 #

    У Вас код какой-то левый - устаревший или измененный. В текущей версии waLongActionController "sleep(1);", а там где usleep стоит проверка по параметру который мы можем изменять:

    $attempts_limit = max(1, $this->_read_attempt_limit);
    ...
    if ($attempts < $attempts_limit) {
        usleep(mt_rand(500, 1500));
    }
    • +1
      Александр Тарасенко Александр Тарасенко 21 января 2018 12:30 #

      проверили, все обновленное

      wa-system/controller/waLongActionController.class.php (чуть нумерация сбилась из-за дебага, а так код идентичный)


      а то что вы приводите это 416 строка

      • +3
        info@ravencode.ru info@ravencode.ru 21 января 2018 12:46 #

        понял, по поводу Вашего куска:

         while (time() <= $time + $waitTime) {

        можно просто метод переопределить

         $waitTime = $this->getLockWaitTime();

        вообще по хорошему надо в код WA добавить проверку

        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {

        т.к. проблема флокинга акуальна только на винде. Я бы послал PR, но WA игнорит все PR с изменениями.

        • +1
          Александр Тарасенко Александр Тарасенко 21 января 2018 12:53 #

          Да если переопределить то задержки нет, но сомневаюсь что модераторы такое пропустят) хотя попробовать можно

          И с PR полностью согласен, уже даже не пытаемся ничего отправлять

          • +1
            info@ravencode.ru info@ravencode.ru 21 января 2018 13:15 #

            В смысле модераторы не пропустят? В своих классах Вы можете переопределять любые не private\final методы

  • 2

    Вы готовы к последствиям не сработавшей блокировки и запуску десятков параллельных тяжеловесных процессов?

  • 1
    Александр Тарасенко 22 января 2018 19:35 #

    Нет конечно! а к чему вопрос?

    Размещая информацию, я не ждал для нее решения (хотя спасибо info@ravencode.ru некое решение есть), а для составления некой базы по проблемам, чтобы если у кого возникнет похожая проблема, было известно из-за чего она, и не было потрачено уму времени чтобы понять так и должно быть или где-то ошибка.

    P.S. кстати, тут у вас недостоверная информация https://developers.webasyst.ru/cookbook/basics/cla... если делать все как по инструкции не получится желаемого результата, в блоке //первый запуск скрипта нужно вызывать две функции step с разным интервалом, тогда один останется постоянно висеть в качестве рабочего процесса, а второй запустить цикл информационных запросов.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите