...
Just my blog

Blog about everything, mostly about tech stuff I made. Here is the list of stuff I'm using at my blog. Feel free to ask me about implementations.

Soft I recommend
Py lib I recommend

I'm using these libraries so you can ask me about them.

Python - Django Celery - кейс длиною в вечность.

Вкратце: когда добавляешь пачку тасок на Celery worker'ы, случается так, что парочка из них отваливается или засыпает или еще чего. Долго не доходили руки поправить это недоразумение, поэтому я просто рестартовал все воркеры раз в пару дней или прямо перед началом проверки рутины, в общем очень сложно было поймать и воспроизвести тот случай, когда без каких-либо ошибок воркер просто молчал. И наконец дошоли руки запилить кривофикс, время покажет насколько он толковый, суть в следующем: В сразу после момента определения свободного воркера  - запускать app.control.heartbeat() и app.control.ping(timeout=10) и если ответ пришел (в виде [{'alpha@host': {'ok': 'pong'}}]) - значит воркер готов и можно передавать ему таску, пачку тасков, рутину и тп. Если ответ пришел отличным от этого - даем ошибку и ничего не запускаем далее. При плохом раскладе пользователю придется просто перезапустить задачу посредством нажатия кнопочки еще раз, а вот запланированная таска - умрет. Общий вид на код примерно такой: Набросавши на скорую руку

app.control.heartbeat(destination=[worker_name])
w_ping = app.control.ping(destination=[worker_name], timeout=10)

worker_up = dict()
for pinged in w_ping:
    for ping_k, ping_v in pinged.items():
        if 'pong' in ping_v.get('ok'):
            answer = ping_v.get('ok')
            worker_up.update({ping_k.replace("@host", ''): answer})
            log.debug("answer ping_k: %s %s", ping_k, answer)

  В планах конечно же сделать еще одну автопроверку, если воркер не ответил - выбрать другой и переназначить, о чем в последующем обновлении страницы и письма - уведомить пользователя, ведь в конечном итоге ему все равно какой именно воркер использовался, а я потом смогу отловить ошибку по логам, или сделать отдельную ветку со сбором всей статистики в момент когда ошибка произошла. ======================================== Здесь что-то будет? Пока еще не знаю с чего начинать цикл постов о том, "Celery на Django или: Как я перестал бояться и полюбил Test Automation" - потому что в идеале его нужно начинать с самого начала, пару лет назад, когда я только начал делать автоматизацию локальных прогонов тестов, синтаксиса TPL и прочих няшек - а это очень много материала. Придется описывать и вспоминать очень многое, лазить в дербри ужасного старого кода, который я писал в свободное от работы время и на скорую руку лишь бы работало вот сейчас. И то как этот старый код перерос себя и несколько раз менял систему и дизайн.  Так или иначе, здесь должна будет разместиться плашка с кратким описанием истории, ссылками на посты, оглавление и все такое прочее, но это будет сделано сильно позже, а пока я просто попробую записать текущие интересные заметки, пока не забыл.