Управление общими ресурсами с потоками в Huey - PullRequest
0 голосов
/ 20 апреля 2019

Мне нужно обновить много строк (с шагом по одному значению в каждой строке) в базе данных peewee (SqliteDatabase).Некоторые объекты могут быть не созданы, поэтому я должен создать их со значениями по умолчанию, прежде чем работать с ними.Я бы использовал способы, которые есть в документах peewee ( Атомные обновления ), но я не мог понять, как смешивать model.get_or_create() и in [my_array].

Поэтому я решил сделать запросы втранзакция для ее фиксации один раз в конце (я надеюсь, что это так)4 рабочих) в Хьюи, потому что .atomic() блокирует соединение (peewee.OperationalError: database is locked).Я пытался использовать @huey.lock_task, но это не решение моей проблемы, как я нашел.

Код моего класса:

class Article(Model):
    name = CharField()
    mention_number = IntegerField(default=0)

    class Meta:
        database = db

Код моего задания:

@huey.task(priority=30)
def update(names):  # "names" is a list of strings
    with db.atomic():
        for name in names:
            article, success = Article.get_or_create(name=name)
            article.mention_number += 1
            article.save()

1 Ответ

0 голосов
/ 27 апреля 2019

Что ж, если вы используете последнюю версию Sqlite (3.24 или новее), вы можете использовать опционные запросы в стиле Postgres.Это хорошо поддерживается Peewee: http://docs.peewee -orm.com / ru / latest / peewee / api.html # Insert.on_conflict

Чтобы ответить на другой вопрос об общих ресурсах, этоиз вашего примера непонятно, что бы вы хотели случиться ... Sqlite допускает только одну транзакцию записи за раз.Поэтому, если вы используете несколько потоков, в каждый момент времени может выполняться запись только одного из них.

Peewee хранит соединения с базой данных в локальном потоке, поэтому базы данных Peewee можно безопасно использовать в многопоточных приложениях.

Вы не упомянули, почему huey lock_task не будет работать.

Еще одно предложение - попытаться использовать WAL-режим с Sqlite, так как WAL-режим позволяет нескольким транзакциям считывания сосуществовать с одним писателем.

...