Почему не работает программа, когда боту пишут много людей?

Есть Telegram-бот, который выдаёт случайное имя из файла, на библиотеке telebot. Вот код:

import telebot
from telebot import types
import random
name=open('C:\\Users\\user\\naames.txt')
names=name.read()
nnn=names[:].split('.')
aaa=[]
nnn2=nnn[:]
names=names.split('.')
nnn3=names[:]
name.close()
bot = telebot.TeleBot('мой токен')
def fu(cu):
    global names
    global aaa
    aaa.append(cu)
    sa=random.choice(nnn3)
    msg = 'Тебе выпал(а): '+sa
    nnn3.remove(sa)
    name=open('C:\\Users\\user\\naames.txt', 'w')
    name.write('.'.join(names))
    name.close()
    return msg

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    global names
    global pert
    if message.text=='/start':
        bot.send_message(message.from_user.id, text='''
Приветствую тебя, мой дорогой друг✨

Напиши фамилию и имя''')
        file = open('C:\\Users\\user\\photo.png', 'rb')
        bot.send_photo(message.chat.id, file)
    else:
        if message.text in nnn:
            pert=message.text
            if message.from_user.first_name and message.from_user.last_name:
                print('ID: '+str(message.from_user.id)+' ; NAME: '+message.from_user.first_name+' '+message.from_user.last_name)
            elif message.from_user.first_name:
                print('ID: '+str(message.from_user.id)+' ; NAME: '+message.from_user.first_name)
            elif message.from_user.last_name:
                print('ID: '+str(message.from_user.id)+' ; NAME: '+message.from_user.last_name)
            bot.send_message(message.from_user.id, "Привет, "+message.text.split()[1]+"!")
            keyboard = types.InlineKeyboardMarkup()
            key_n = types.InlineKeyboardButton(text='Имя!', callback_data='name')
            keyboard.add(key_n)
            bot.send_message(message.from_user.id, text='Жми кнопку!', reply_markup=keyboard)
        else:
            print(message.text+' - такого имени нет - отказ;')
            bot.send_message(message.from_user.id, 'Такого имени нет!\nПроверь, что ты ввёл всё верно.')
@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
  global s
  global aaa
  if pert not in aaa:
      
      while True:
          s=fu(pert)
          if s != pert and pert.split()[0]!=s.split()[0]: break
      bot.send_message(call.message.chat.id, s)
      print(pert+' - '+s)
  else:
        bot.send_message(call.message.chat.id, 'Ты уже смотрел(а) имя!')
        print(pert+' - отказ - имя уже просмотрено')
print('Запуск\n\n\n')
bot.polling(none_stop=True, interval=0, timeout = 1111120)

В файле naames.txt хранятся имена через точку. Пробовал запускать программу с двух компьютеров, всё нормально. Запустили примерно 40-50 человек - всё стало путаться, выдавалось по 5 имён, иногда давал одинаковые.

В чём проблема? Можно ли её исправить?

P.S. Знаю, что код можно сократить, но писать мне это не надо, т.к. мне так удобнее


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

Автор решения: Asynco

Проблема в том, что библиотека telebot не асинхронная и в целом не предназначена для работы с большим количеством юзеров в связке с базами данных (или как в твоем случае с naames.txt)

Тут я могу только предложить переписать бота на aiogram. Сам он похож на telebot, однако лучше работает с фильтрами и в целом асинхронен

→ Ссылка