Встречается на собеседованиях • сегодня

Применял ли какие-то синхронизирующие примитивы на Celery

Да, применял. В Celery часто возникают ситуации, когда нужно синхронизировать доступ к общим ресурсам между воркерами. Основные примитивы:

  1. Redis Lock - самый распространённый вариант:
python
from redis import Redis
from redis.lock import Lock

redis = Redis()
lock = Lock(redis, "my_resource_lock")

@app.task
def process_data():
with lock:
# Критическая секция
do_something()

text

2. **Celery Singleton** - для предотвращения дублирования задач:
```python
from celery_singleton import Singleton

@app.task(base=Singleton)
def process_data(data):
    # Эта задача не будет запущена, если такая же уже выполняется
  1. Database Locks - для синхронизации через БД:
python
from django.db import transaction
from django.db.models import F

with transaction.atomic():
    obj = MyModel.objects.select_for_update().get(id=1)
    obj.counter = F('counter') + 1
    obj.save()

Выбор примитива зависит от конкретного сценария и инфраструктуры. Redis Lock хорош для распределённых систем, а Database Locks - когда работа идёт с БД.

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы