Python: как поток ожидает завершения другого потока, прежде чем возобновить его выполнение? - PullRequest
0 голосов
/ 05 января 2019

Я создаю бота для телеграмм, этот бот будет использовать базу данных (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()

1 Ответ

0 голосов
/ 05 января 2019

Вы можете использовать threading.Thread.join(). Это будет ожидать окончания потока и продолжится только после завершения потока.

Использование ниже:

import threading as thr
thread1 = thr.Thread()  # some thread to be waited for
thread1 = thr.Thread()  # something that runs after thread1 finishes
thread1.start()         # start up this thread
thread1.join()          # wait until this thread finishes
thread2.start()
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...