在Huey中使用线程管理共享资源

时间:2019-04-20 13:32:06

标签: thread-safety peewee python-huey

我必须更新peewee数据库(SqliteDatabase)中的许多行(每行增加一个值)。某些对象可能无法创建,因此在使用它们之前,我必须使用默认值创建它们。我会使用peewee文档(Atomic updates)中的方法,但是我不知道如何混合使用model.get_or_create()in [my_array]

因此,我决定在事务中进行查询以在结束时提交一次(希望如此)。

为什么我要写堆栈溢出的原因是因为我不知道如何使用db.atomic()锁定连接({{ 1}})。我尝试使用.atomic(),但这并不是我所发现问题的解决方案。

我班上的代码:

peewee.OperationalError: database is locked

我的任务代码:

@huey.lock_task

1 个答案:

答案 0 :(得分:0)

好吧,如果您使用的是Sqlite的最新版本(3.24或更高版本),则可以使用Postgres样式的upsert查询。 Peewee对此提供了很好的支持:http://docs.peewee-orm.com/en/latest/peewee/api.html#Insert.on_conflict

要回答有关共享资源的其他问题,您的示例中尚不清楚您要发生的情况... Sqlite一次仅允许一个写入事务。因此,如果您正在运行多个线程,则在任何给定时间都可能只有一个线程在写。

Peewee将数据库连接存储在本地线程中,因此Peewee数据库可以安全地用于多线程应用程序中。

您没有提到为什么huey lock_task无法正常工作。

另一个建议是尝试将WAL模式与Sqlite一起使用,因为WAL模式允许多个读取器事务与单个写入器共存。