Django&Celery:我是否需要transaction.atomic / locking以避免竞争条件?

时间:2018-06-26 10:14:05

标签: django celery django-celery atomicity

我的应用程序中的用户可以将从API获取的数据导入到我的Django数据库中。如果要提取> 100个以上的结果,则该API使用分页。

我显然不希望用户等待大量可能导入的项目。因此,我要在请求中首先调用API,然后将其余的委托给Celery。

> User requests an API item with 250 items
> Fetch 100 and return
> Fetch 150 more in a celery task

我担心数据库损坏。我在Heroku上使用以下Procfile中的配置运行我的应用程序:

web: daphne app.asgi:channel_layer --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py migrate --noinput && python manage.py runworker -v2
celerybeat: celery -A app beat -l info
celeryworker: celery -A app worker -l info

我这样称呼任务:

        if rginitial_count >= 100:
            continue_doing_imports.delay(artist_mbid=self.mbid,
                                         artist_name=self.name,
                                         offset=100)

如何确保行为一致?例如,user A正在导入Artist X的数据,同时user B试图订阅该艺术家,因此需要写他的关系吗?这是我能想到的一种情况。

0 个答案:

没有答案