2016-05-25 5 views
0

Ниже приведен фрагмент кода:Доступ глобальных переменных в setImmediate в node.js

var buffer = new Buffer(0, 'hex'); //Global buffer 
socket.on('data', function(data) { 
    // Concatenate the received data to buffer 
    buffer = Buffer.concat([buffer, new Buffer(data, 'hex')]); 
    setImmediate(function() { // Executed asynchronously 
    /*Process messages received in buffer*/ 
    var messageLength = getMessageLength(buffer); 
    while (buffer.length >= messageLength) { 
     /*Process message and send response*/ 
    } 
    //Remove message from buffer after processing is done 
    buffer.splice(messageLength); 
    }) // End of setImmediate 
}) //End of socket.on 

Я использую глобальную переменную «буфера», внутри блока setImmediate (асинхронно). Есть ли гарантия того, что глобальная буферная переменная не изменится (из-за добавления данных или удаления данных) во время выполнения кода в блоке setImmediate? Если нет, то как обращаться с безопасным доступом к буферам?

+0

В чем проблема? Вы хотите, чтобы буфер был безопасным (буфер не используется внешней программой) при вызове setImmediate? Если setImmediate func body синхронизирован, вам не нужно беспокоиться об этом, javascript - это единственный поток. Если setImmediate func body является асинхронным, используйте переменную закрытия вместо глобальной. –

ответ

0

Часто повторяющееся высказывание «NodeJS однопоточное» означает, что здесь нет вопроса о «безопасности». Одновременный доступ к переменной невозможен, поскольку одновременные операции не выполняются. Несмотря на то, что код setImmediate выполняется асинхронно, это не означает, что он выполняется как САМОЕ ВРЕМЯ. Это просто означает, что он выполняется «скоро». Родительская функция может вернуться до того, как это произойдет, но родительская функция не запущена, когда вызван анонимный обратный вызов setImmediate. В то время обратный вызов - это единственное, что работает.

Эти операции, таким образом, безопасны, но для чего это стоит, это не очень эффективно. Буферы NodeJS имеют фиксированную длину, поэтому вам необходимо сохранить перераспределение нового для добавления данных. Они подходят для одноразовых нагрузок, но не идеальны для постоянных операций добавления. Рассмотрите возможность использования читаемого потока. Это позволяет вам вытягивать и обрабатывать любую длину данных, которые вы хотите за раз, и может возвращать буфер. Но внутренне он не постоянно перераспределяет свой блок памяти для чтения данных.

Смежные вопросы