Выполнять функции один раз для всех потоков - PullRequest
0 голосов
/ 22 января 2020

Функция логгера, вызываемая несколькими потоками (виртуальными пользователями). Я хочу выполнять функции printDebugLogs (debugLogsRepo) и printResponseCodeRepo (responseCodeRepo) только по истечении заданной продолжительности, т.е. когда IsElapsedTime вернет true. В настоящее время все потоки выполняют эту функцию много раз.

// Функция логгера, выполняемая многопоточностью

var debugLogsRepo = []
var responseCodeRepo=new Map();
var duration;
var startTime=new Date().getSeconds();

export function Logger(url, request, response, reqFrom, conf) {
    //If logging enable
    if (conf.logging) {
        //ClienSide logging enable
        if (conf.clientSideLog) {
            //If request failed
            pushFailedRequest(url, request, response, reqFrom, debugLogsRepo);
        }
        //Insert all response codes(i.e pass and failed)
        pushResponseCodeStats(response, responseCodeRepo)

        //Condition based on which flush logs
        if ((IsTimeElapsed(conf))) {
            printDebugLogs(debugLogsRepo);
            printResponseCodeRepo(responseCodeRepo)
        }
    }
}


//If duration has been passed
export function IsTimeElapsed(conf) {
    var duration = conf.logInterval;
    var currentTime = new Date().getSeconds();
    if ((Number(startTime) + Number(duration)) <= currentTime) {
        startTime = new Date().getSeconds();
        return true
    }
    return false;
}

1 Ответ

1 голос
/ 23 января 2020

Каждый VU в k6 является независимо выполняемой JavaScript средой выполнения, возможно, даже на отдельных машинах, поэтому вы не можете синхронизировать такие вещи между VU.

Если вы отлаживаете что-то, вы можете просто запустить свой скрипт только с одним VU. Или, если по какой-то причине вам нужно запустить несколько VU во время отладки, вы можете распечатать журналы отладки только в одном VU, проверив __VU переменную контекста выполнения :

if (__VU == 1) {
    // print logs
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...