Параллельность в работе чат-бота (python)
пишу телеграм-бота на aiogram. При его работе должны выполняться регистрация пользователей на прием и оповещение пользователей о приеме. Регистрация основана на FSM через хендлеры. Оповещение пользователя производится за сутки до приема: происходит 24/7 проверка через базу данных о необходимости отправки уведомления пользователю. Проблема: при исполнении кода работает либо оповещение, либо возможность регистрации, но не все вместе. Мне необходимо, чтобы даже при выполнении регистрации каким-либо пользователем параллельно проверялась необходимость отправки уведомлений другим пользователям. Часть исполняемого кода:
from aiogram import Bot, Dispatcher, executor, types
import logging
import sqlite3 as sq
from aiogram import types
from aiogram.dispatcher.filters import Command
from aiogram.dispatcher.filters import Text
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from register import Registration
from aiogram.dispatcher import FSMContext
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton,\
InlineKeyboardMarkup, InlineKeyboardButton
from datetime import datetime
from config import API_TOKEN
import asyncio
#Блок кода по регистрации
@dp.message_handler(commands=['start'])
async def start_message(message: types.Message):
# Создание пользовательской клавиатуры для удобства пользования
greet_kb = ReplyKeyboardMarkup()
but_1 = KeyboardButton('/reg')
but_2 = KeyboardButton('/note')
greet_kb.add(but_1, but_2)
await message.reply('Добрый день, Вы обратились в салон "Геракл".\n'
'Выберите, что Вам необходимо, из списка',
reply_markup=greet_kb)
@dp.message_handler(Command('reg'), state=None)
async def ans_fio(message: types.Message):
await message.answer('Укажите Ваше ФИО')
await Registration.Register.set()
await Registration.next()
#передаем состоянию ФИО
@dp.message_handler(state=Registration.Init)
async def ans_phone(message: types.Message, state: FSMContext):
fio = message.text
await state.update_data(fio=fio)
await message.answer('Укажите Ваш номер телефона для дальнейшей связи.
Форма ввода: только цифры, без пробелов')
await Registration.next()
#Передаем состоянию номер телефона
@dp.message_handler(state=Registration.Phone)
async def ans_finish(message: types.Message, state: FSMContext):
phone = message.text
await state.update_data(phone=phone)
data = await state.get_data()
ans1, ans2, ans3 = message.chat.id, data.get('fio'), data.get('phone')
con = sq.connect('saloon.db')
cur = con.cursor()
data_tuple = (ans1, ans2, ans3, ans4, ans5, ans6)
cur.execute("""
INSERT INTO saloon
(Telegram_ID, ФИО, Номер_телефона)
VALUES (?, ?, ?, ?, ?, ?);
""", data_tuple)
con.commit()
con.close()
await state.finish()
#Функция для ожидания
async def wait_for_task():
await asyncio.sleep(5)
#Функция оповещения (работает в этом случае, если в таблице БД имеется 1 запись)
async def notification():
await wait_for_task()
con = sq.connect('saloon.db')
cur = con.cursor()
cur.execute("""SELECT Дата, Время, Telegram_ID, Услуга FROM saloon WHERE
Сообщение = 'Active';""")
data1 = cur.fetchall()
con.commit()
con.close()
if len(data1) == 1:
now = datetime.now()
date = data1[0][0] + ' ' + data1[0][1]
new_date = datetime.strptime(date, '%d.%m.%Y %H:%M')
diff = new_date - now
if diff.total_seconds() <= 86400:
await bot.send_message(data1[0][2], f'У вас имеется сеанс на
{data1[0][0]} {data1[0][1]}')
con = sq.connect('saloon.db')
cur = con.cursor()
cur.execute("""UPDATE saloon SET Сообщение = 'Inactive'
WHERE Дата = ? AND Время = ? AND Telegram_ID = ?;""", data1[0])
con.commit()
con.close()
executor.start_polling(dp)