Python:一个线程如何在恢复执行之前等待其他线程结束?

时间:2019-01-05 00:35:48

标签: python-3.x multithreading sqlite locking

我正在制作一个用于电报的机器人,该机器人将使用数据库(SQLite3)。

我熟悉线程和锁,并且可以安全地启动对数据库进行查询的多个线程。 我想更新/插入数据时出现问题。

使用threading module中的Condition和Event,可以防止新线程在线程更新/插入数据时访问数据库。

我还没弄清楚的是如何在更新/插入数据之前如何等待所有访问数据库的线程完成。

如果我能获得信号量的数量,我就等它降至0,但由于不可能,我应该使用哪种方法?

更新:我无法使用join(),因为我正在使用telegram bot并根据对机器人的每个请求动态创建线程,因此创建线程时我不知道是否必须等待它结束。

澄清:仅在以下情况下才能使用join():在线程开始时,您知道是否必须等待其结束。由于我为客户的每个请求都创建了一个线程,因此我不知道他们会问什么,以及何时完成请求,因此我不知道是否使用join()。

UPDATE2:此处是有关锁的代码。我还没有完成有关数据库的代码,因为我更关注锁,而且它似乎与问题无关。

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 :(得分:0)

您可以使用=IIF( Sum(Fields!servicetotal.Value, "Service") - Sum(Fields!servicefee.Value, "Service")<0, 0, Sum(Fields!servicetotal.Value, "Service") - Sum(Fields!servicefee.Value, "Service") ) 。这将等待线程结束,并且仅在线程完成后继续。

用法如下:

threading.Thread.join()
相关问题