Есть почти готовый бот для сообщества ВК. Его задача - принимать заказы у людей, заносить их в базу данных mysql и после выдавать их администраторам по мере выполнения. Процесс заказа и его обработки занимает время, в которое другие люди должны иметь возможность взаимодействовать с ботом.
Я читал в других вопросах про asyncio, но особо ничего не понял. Видел где-то примеры с несколькими токенами.
После заказа он попадает в очередь. Мне нужно, чтобы во время заказа одним пользователем, другой юзер мог тоже активно работать. Т.к во время первого заказа бот будет ждать ответ определенного пользователя.
В общем нужна помощь, как это реализовать.
После сохранения заказа в базу завершайте взаимодействие с пользователем. Выполнение заказов повешайте на другой процесс, крон задачу и др. И после этого выдавайте администраторам.
После заказа он попадает в очередь. Мне нужно, чтобы во время заказа одним пользователем, другой юзер мог тоже активно работать. Т.к во время первого заказа бот будет ждать ответ определенного пользователя.
kustiktm_kirill, зачем боту ждать ответ определённого пользователя? Вам надо от этого избавляться, иначе придётся использовать многопоточность, что приведёт к увеличению нагрузки, увеличению кол-ва процессов, а из-за этого повышение сложность контроля за всем этим.
Sergey, пользователь поочередно вводит данные, бот их сохраняет, направляет в базу данных, как новый заказ и удаляет эти данные из своих переменных. И так проиходит каждый заказ. Если люди будут заказывать одновременно, то будет нехилая задержка
kustiktm_kirill, странная логика, так не должно быть. Надо менять логику, чтобы не прибегать к большим проблемам из-за многопоточности.
Callback или LongPoll API ?
Обработчик событий должен обработать все события и ожидать следующих, он не должен ждать от какого то определенного пользователя сообщение.
Longpoll, честно, мне не понравился. Удобнее Callback Api.
while True:
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.from_user and event.to_me:
response = event.text.lower()
if response == 'начать':
vk.messages.send(
user_id=event.user_id,
message='Приветствуем в нашем сообществе!',
random_id=get_random_id(),
keyboard = start_kb.get_keyboard()
)
if response == 'сделать заказ':
temp_id = event.user_id
vk.messages.send(
user_id=temp_id,
message='Нажимая кнопку Да Вы полностью соглашаетесь с правилами об оказании и проведением наших услуг.\nЕсли Вы НЕ согласны с правилами, нажмите кнопку Нет.\nС ценами Вы можете ознакомиться в нашем сообществе.',
random_id = get_random_id(),
keyboard = rules_cont.get_keyboard()
)
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.from_user and event.to_me:
response = event.text.lower()
if response == 'да':
vk.messages.send(
user_id=temp_id,
message='Выберите режим игры',
random_id=get_random_id(),
keyboard=other_game_kb.get_keyboard()
)
Вот небольшой кусок кода. И так происходит каждое действие при заказе.
kustiktm_kirill,
Зачем второй раз цикл for event in longpoll.listen() ? Из-за него все проблемы.
Вам надо использовать какое то хранилище для временных данных, и при каждом сообщении обрабатывать нужным образом событие, проверяя эти данные в хранилище.