Как реализовать прибавление значения AioGram?

Есть телеграм бот написанный на Python и AioGram. Каждую секунду пользователю необходимо прибавлять некое число в базу данных.
Логика работы простая:

  1. Бот забирает старое значение из БД.
  2. Прибавляет к нему определенное число, например 1.
  3. Записывает новое значение обратно в БД.

    Как можно реализовать такой функционал? Чтобы это работало для каждого пользователя бота, их может быть 1000+. Думаю использовать Threading или Multiprocessing, но может быть есть более лучшее решение?

Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Можно использовать подход, который позволит избежать постоянного обновления баланса счета для многих пользователей.

Идея в том, чтоб храните последний баланс balance и дату last_balance_calc_time когда его считали. При чтении с БД вы всегда можете посчитать сколько времени прошло с last_balance_calc_time и сколько с тех пор денег должно добавиться. Т.е. вы не храните деньги числом, а расчитывайте из значения balance, last_balance_calc_time и текущего времени. При приходе/расходе пересчитывайте текущий баланс и сохраняйте его вместе с текущим временем.

Дополнительно, можно пересчитывать баланс регулярно. Если делать это раз в секунду, то получится то, что вы хотите (учтите только, что с запуском может быть задержка, так что лучше смотрите на время прошедшее от прошлого пересчета). Можно запускать реже или вообще только при изменениях баланса.

Собственно регулярный запуск потока для пересчета делайте, как описано тут ru.stackoverflow.com/a/1418626/218971.

Имеет смысл одним запросом сразу всем пользователям добавлять деньги запросом типа такого:

update user_money
   set balance = balance + rate * (current_time() - last_balance_calc_time),
       last_balance_calc_time = current_time() 
→ Ссылка