Я создаю бота для телеграмм, этот бот будет использовать базу данных (SQLite3).
Я знаком с потоками и блокировками и знаю, что безопасно запускать несколько потоков, которые делают запрос к базе данных.
Моя проблема возникает, когда я хочу обновить / вставить данные.
Используя условие и событие из модуля потоков , я могу запретить новому потоку обращаться к базе данных, пока поток обновляет / вставляет данные.
Что я не понял, так это как дождаться завершения всех потоков, обращающихся к базе данных, прежде чем обновлять / вставлять данные.
Если бы я мог получить число семафоров, я бы просто подождал, пока он упадет до 0, но так как это невозможно, какой подход я должен использовать?
ОБНОВЛЕНИЕ: я не могу использовать join (), так как я использую telegram bot и создаю поток динамически с каждым запросом к моему боту, поэтому, когда создается поток, я не знаю, если я ' придется подождать до конца или нет.
УТОЧНЕНИЕ: join () можно использовать только в том случае, если в начале потока вы знаете, нужно ли вам ждать его завершения или нет. Поскольку я создаю поток для каждого запроса моих клиентов и не знаю, что они будут запрашивать, и когда запрос будет выполнен, я не могу знать, использовать ли join () или нет.
ОБНОВЛЕНИЕ 2: Здесь код, касающийся замков. Я не закончил код в отношении базы данных, так как меня больше волнуют блокировки, и он, похоже, не имеет отношения к вопросу.
lock = threading.Lock()
evLock = threading.Event()
def addBehaviours(dispatcher):
evLock.set()
# (2) Fetch the list of events
events_handler = CommandHandler('events', events)
dispatcher.add_handler(events_handler)
# (3) Add a new event
addEvent_handler = CommandHandler('addEvent', addEvent)
dispatcher.add_handler(addEvent_handler)
# (2) Fetch the list of events
@run_async
def events(bot, update):
evLock.wait()
# fetchEvents()
# (3) Add a new event
@run_async
def addEvent(bot, update):
with lock:
evLock.clear()
# addEvent()
evLock.set()