#javascript #node.js
#javascript #node.js
Вопрос:
Я пишу игру на javascript, и на сервере, который выполняет сервисы world / map, мне также нужно добавить команду, которая обновляет все объекты.
Допустим, что объект / монстр перемещается, это означает, что всем подключенным клиентам отправляется постоянное обновление.
Если я сделаю что-то вроде
while(true)
sendToAllConnectedClientsNearToThisMonster(data)
items.forEach
checkIfItemHasNotExpiredYet(item)
deleteItemFromWorldIfExpired()
Но в то же время тот же сервис выполняет другие действия, такие как обработка входящих и исходящих пакетов. Шифрование расшифровывающих пакетов. Маршрутизация пакетов, пересылка пакетов чата на сервер чата … и т.д..
Не будет ли это блокировать мой node.js сервер? Каков правильный способ решения таких задач?
Комментарии:
1. (небольшой совет: для обработки истечения срока действия я использую тайм-аут) Вы должны взглянуть на bukkit, чтобы увидеть, как они это делают.
2. тайм-аут может продолжать проверку в течение нескольких секунд, не блокируя все другие функции?
3. @Vinz243 bukkit, похоже, написан на Java, а не на Javascript.
4. тайм-аут — это функция, которая выполняется через некоторое время. Я использую его, когда, например, я хочу сохранить IP-адреса на некоторое время (скажем, минуту), а затем удалить его. Буккитис написан на java, да, но вы все равно можете взглянуть. Это сервер minecraft, поэтому там много движений монстров. Если вы предпочитаете, есть github.com/NetEase/lordofpomelo но я не уверен в его «ценности».
Ответ №1:
Используйте setInterval
, он выполняет вашу функцию каждые X (в этом примере 250) миллисекунд. Таким образом, вы не блокируете свой сервер. Поскольку node.js является однопоточным, вы всегда должны следовать закону очередей: никогда не ждите. Никогда не блокируйте. И заканчивайте быстро!
Вот ваш псевдокод, завернутый в setInterval:
setInterval( function() {
sendToAllConnectedClientsNearToThisMonster(data)
items.forEach
checkIfItemHasNotExpiredYet(item)
deleteItemFromWorldIfExpired()
}, 250);
http://nodejs.org/api/timers.html#timers_setinterval_callback_delay_arg
Комментарии:
1. однопоточный, что означает, что он может выполнять только 1 задачу в любой момент времени, верно? Должна ли быть причина откладывать время от времени неважные задачи?
2. Да, вы можете делать только одну вещь за раз
3. Похоже, я должен разбить свои сервисы на более мелкие части и просто иметь 1 сервис для маршрутизации всех входящих пакетов TCP. хммм. в любом случае спасибо.