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.
- Mobaxterm SSH RDP FTP...
- Thunderbird Email client
- Filezilla FTP client/server
- Nirsoft Win utils
- Sysinternals Win utils
- Pi-Hole AD block by DNS
- NUT UPS manager
- Rpi MON Raspberry monitoring
- Free CAD 3D modelling
- Free Commander Far-like filemanager
- Bitwarden Password manager
- Django web framework
- celery multi-tasking
- celery-beat Celery + Django
- celery-results Celery + Django
- Pillow Python image lib
- wsgi mod Apache + Python
- requests best in WEB requests
- openpyxl make Excell docs
- p4python Perforce + Python
- paramiko SSH + Python
- pyvmomi ESXi Vcenter + Python
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 и прочих няшек - а это очень много материала. Придется описывать и вспоминать очень многое, лазить в дербри ужасного старого кода, который я писал в свободное от работы время и на скорую руку лишь бы работало вот сейчас. И то как этот старый код перерос себя и несколько раз менял систему и дизайн. Так или иначе, здесь должна будет разместиться плашка с кратким описанием истории, ссылками на посты, оглавление и все такое прочее, но это будет сделано сильно позже, а пока я просто попробую записать текущие интересные заметки, пока не забыл.