Обычно есть две части: веб-интерфейс и фоновый демон (часто называемый «обработчиком событий»).
Веб-интерфейс выполняет все вещи, доступные только для чтения, и безопасные вещи, где условия гонки не являются проблемой ввсе - смена пароля, переименование вещей и т. д.
Более важные вещи, такие как построение юнитов или сражение с другими игроками, передаются в обработчик событий, где они проверяются, проверяются и затем сохраняются до тех пор, пока не истечет время выполнения.достиг.Выполнение проверок в этом месте, а не в веб-интерфейсе имеет то преимущество, что вы полностью устраняете риск состояния гонки (например, запускаете корабли, содержащие все юниты на планете, в то же время создавая что-то дорогое, что в основном приведет к дублированию доступных юнитов).игрока) при условии, что в данный момент времени выполняется только одно действие / событие (например, нет многопоточности, многопроцессорной обработки и т. д.).
Если у вас не полностью в режиме реального времени, но используются «галочки» (например, только действияслучается каждые x минут), вы, конечно, можете использовать cronjob вместо фонового демона - но тогда вам нужно использовать другой способ избежать условий гонки.
В моей собственной игре у меня есть фондемон, имеющий RPC-подобный интерфейс, поэтому в веб-интерфейсе я просто вызываю функцию syncCall('someFunction', ....);
, которая затем подключается к фоновому демону через сокет и выполняет данную функцию, возвращая все, что возвращает эта функция.
Однако, если бы я написал новую игру сейчасДа, я бы, конечно, пошел с асинхронным решением, таким как node.js или одной из асинхронных структур Python.Это устраняет необходимость иметь две разные части - но для некоторых частей вам придется позаботиться о блокировке, поскольку всякий раз, когда вы возвращаетесь из одной из ваших функций, вызываемых самим узлом, может выполняться обратный вызов из другого события.