我正在制作一个用于电报的机器人,该机器人将使用数据库(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()
答案 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()