Лучшее решение для игры с растущим числом?

Я переделываю вопрос, который я задал здесь, основываясь на обратной связи, которую мне дали. Если в моем вопросе все еще есть что-то неясное, пожалуйста, дайте мне знать.

Пояснение к игре: Игра с растущим числом, в которой пользователь должен угадать, когда число перестанет расти. Это чисто случайный шанс и осуществляется путем нажатия пользователем на кнопку. Число вычисляется на стороне сервера после каждой игры. Число будет увеличиваться на 0.01, начиная с 1.00, до тех пор, пока число не будет рассчитано на стороне сервера.

Решение, которое я придумал: Запуск фонового процесса с помощью apischeduler. Выполнение функции увеличения числа каждые 0.1 секунды, которая добавляет 0.01 к текущему состоянию числа и отправляет результат состояния на фронтенд с помощью Django Channels. Я извлекаю и обновляю состояние с помощью запросов к базе данных. Когда конечный результат (число) будет достигнут, будет вычислено новое число и будет запущен таймер до начала новой игры

Все это кажется странным, учитывая, что я вызываю функцию в фоновом режиме каждые 0,1 секунды бесконечно. Однако я не могу понять, как выполнить задачу по-другому. Есть ли лучшее решение/более эффективный способ сделать то, что я пытаюсь достичь?

Пример кода для увеличивающейся части и отправки ее на передний край:

jobs.py

# Running this function every 0.1 seconds.
def increaseNumber():
    gameObj = Game.objects.latest('round_start_time')
    lastGameObj = Game.objects.filter(round_number=gameObj.round_number-1)[0]

    group_name = 'numbers'
    channel_layer = channels.layers.get_channel_layer()

    if lastGameObj.timer > 0:
        # run timer
        oldTimer = lastGameObj.timer
        newTimer = oldTimer - Decimal(0.1)

        Game.objects.filter(round_number=gameObj.round_number-1).update(timer=newTimer)

        async_to_sync(channel_layer.group_send)(
            group_name,
            {
                'type': 'timer',
                'timer': json.dumps(newTimer, cls = DecimalEncoder)
            }
        )

    else:
        if gameObj.over == False:
            # run game
            getcontext().prec = 3
            oldState = gameObj.result_state
            newState = oldState + Decimal(0.01)
            

            Game.objects.filter(id=gameObj.id).update(result_state=newState)

            if newState >= gameObj.result:
                Game.objects.filter(id=gameObj.id).update(over=True)
                async_to_sync(channel_layer.group_send)(
                    group_name,
                    {
                        'type': 'number_game',
                        'state': json.dumps(newState, cls = DecimalEncoder)
                    }
                )
                return

            async_to_sync(channel_layer.group_send)(
                group_name,
                {
                    'type': 'number_game',
                    'state': json.dumps(newState, cls = DecimalEncoder)
                }
            )

consumer.py

async def number_game(self, event):
    state = event['state']

    await self.send(text_data=json.dumps({
        'state': state
    }))

async def timer(self, event):
    timer = event['timer']

    await self.send(text_data=json.dumps({
        'timer': timer
    }))
Вернуться на верх