我正在使用discord.pysqlite3作为我的数据库的www.example.com机器人。我目前的方法是有一个名为Database
的类,它包含一个sqlite3.connection(.conn
)。为了避免引发database locked
错误,我使用with db.conn:
。
我担心的是,由于discord.py是异步工作的,而不是线程工作的,使用这种方式会导致程序阻塞。我的意思是
假设我有两个函数在运行,task1和task2。Task1首先启动,需要大约1分钟才能完成。Task2在之后启动。它们都使用with db.conn
来锁定数据库。在task1中的某个地方,我使用了一个await调用,使python从该函数中休息一下,并执行其他异步函数。它到达task2。Task2调用with db.conn:
,导致单线程程序锁定,直到task1释放锁定。但是,由于程序在task2中被阻塞,因此它永远不会完成task1。
如果我说得不对或者我完全错了,对不起。我的主要问题是,我应该只使用aysncio.Lock
吗?谢啦,谢啦
2条答案
按热度按时间lokaqttq1#
最好使用Async SQLite模块
aiosqlite
e5njpo682#
还有另一个名为PostgreLite的模块,它简化了SQL命令,并考虑了异步进程。只需将
postgreslite
添加到您的需求中或在您的终端中执行pip install postgreslite
。Github页面还提供了examples来了解如何使用该库,其他文档应该很快就会添加。
至于discord.py,在
event.py
文件中,我建议您添加:字符串
在
on_ready()
函数中。这样,bot对象也将携带数据库,您将避免每次运行命令时都加载它。