Бесконечный цикл Javascript для обновления объектов

#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. хммм. в любом случае спасибо.