BufWriter<Master<'_>> – Telegram
BufWriter<Master<'_>>
105 subscribers
451 photos
28 videos
34 files
1.7K links
https://www.patreon.com/alxe_master

Видео/статьи. Конспект и мои вольные комментарии по инженерии. тут только то, что считаю полезным для себя или других =)

#os, #cloud, #rust, #golang, #python, #javaScript, #cpp, etc
Download Telegram
== Как работают большие языковые модели (LLM)
https://youtu.be/XsqkYGHKVao?si=gsHukywu1P3N4djO
А тем временем OpenAI выпустили браузер: теперь выбираем Chrome vs Comet vs OpenAI

*а Dia (ex Arc) купил Atlassian: вот это интересно)

https://every.to/vibe-check/vibe-check-openai-s-new-ai-browser-atlas/?via=anna
== ПОЛНОСТЬЮ БЕСПЛАТНЫЙ УБИЙЦА CURSOR И CLAUDE CODE ОТ ГУГЛ ВЫШЕЛ | GEMINI CLI ОБЗОР
https://youtu.be/SRasGkyiLFk?si=JUeUBJ7G9kRIVNao

ну в целом я в последнее время очень много юзаю именно gemini
оно бесплатно умеет в поиск реально лучше, а так же и минимальный тулинг для работы пашет почти сразу. наверное поюзаю еще и Gemini CLI сравню с Claude-code
только сейчас понял,

появился новый вид поздравлений.
скоро родственники поздравления будут в вайбер генерировать с помощью LLM

АААААА 😄
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
искал себе файлохранилку. кажется нашел. просто случайно посоветовали copyparty. как будто бы все в ней есть

== introducing copyparty, the FOSS file server
https://youtu.be/15_-hgsX2V0?si=DoZGiBazBRfrgczc
🔥2
== FastAPI (Python) vs Axum (Rust) шокирующий тест скорости веб-сервисов!
https://youtu.be/aUough6jwVE?si=SPsLlyyQ6dhk2JNa
все настолько очевидно, что даже видео смотреть не обязательно чтобы знать концовку (с)

== Python VS Rust VS Go! Я заменил FastAPI на LiteStar и это ужасающе быстро!
https://youtu.be/ZSqKTYgaV-4?si=5A6A1PgWoBwNSBeP
Тимлид про раст: ужасно быстро, ужасающе быстро
Тимлид про питон: ужасно, ужасающе(с)
🔥1
== Granian: a Rust HTTP server for Python applications - Giovanni Barillari
https://www.youtube.com/watch?v=VshGh5KLuOk

== GRANIAN
https://github.com/emmett-framework/granian
пито-раст на моем проекте. заметно улучшение. просто дропин замена gunicorn или uvicorn.

видос выше просто заставил меня еще раз посмотреть на этот пакет. сейчас он просто шикарен. 1 день на проде. полет нормальный
больше всего из granian зацепил пакет https://docs.rs/pyo3-asyncio/latest/pyo3_asyncio/
даже не думал что это может быть так просто. взял и ждешь корутину из питона. или наоборот из питона ждешь фьюч из раста. изи
🔥1
спасибо тебе добрый человек, кто бы ты, како бы ты рассы, сексуальной ориентации не был бы, за такое пре-интереснейшее приключение и бессонные ночи и 3 месяца дебага.

Дорогой дневник, мне не подобрать слов, чтобы описать боль и унижение, которое я испытал из-за всего 6 строк кода


def run_on_loop(some: Coroutine):
try:
loop = asyncio.get_event_loop()
except Exception:
loop = asyncio.new_event_loop()
return loop.run_until_complete(some)


вы видите сдесь дедлок ? а он есть !
функции больше чем я в компании... она переезжала раз наверное 40 и в итоге попала в общую либу, и юзалась прям везде в скриптах и streamlit (ну и пусть себе юзалась бы там... там оно работает хорошо)

а дедлок прямо в последней строке

1. Async function вызывает run_on_loop()
2. get_event_loop() возвращает текущий running loop
3. run_until_complete() пытается запустить coroutine на уже running loop
4. **DEADLOCK**: loop ждёт завершения some, но some ждёт свободный loop



Thread 1:
Event Loop (RUNNING)
├── async def main():
│ └── run_on_loop(coro) ← tries to call run_until_complete()
│ └── DEADLOCK: loop already busy executing main()
└── [blocked forever]


100% попадания в дедлок каждый раз когда попадает в эту функцию

а даже asyncio.new_event_loop() без set_event_loop() - loop не становится текущим

asyncio.ensure_future(coro) создает еще больший дедлок. серьезней все висит

а суть вообще вопрос а прикола в том что эта функция СЛУЧАЙНО вызывалась из кода в одной из корутин, и конечно же это же не асинхронная функция - никто даже в мыслях не допускал что оно берет и СТАКАЕТ до конца жизни воркера...

так как заметить это ЗВЗДЦ невозможно - кто откуда и через какую неявную функцию вызывает - то казалось что оно просто тяжелое, медленное и вообще питон не самый лучший язык (нет он хороший, иногда просто какая то ошибка в либе просто руинит ночи)

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

а вот как оно должно работать было. хотя-бы


_thread_local = threading.local()


def run_on_loop(coro: Coroutine[Any, Any, _TR], /) -> _TR:
try:
new_loop_id = id(asyncio.get_event_loop())
if not hasattr(_thread_local, "pool"):
_thread_local.pool = ThreadPoolExecutor(max_workers=5, thread_name_prefix="async_runner")
_thread_local.loop_id = new_loop_id
elif _thread_local.loop_id != new_loop_id:
_thread_local.pool.shutdown(wait=False)
_thread_local.pool = ThreadPoolExecutor(max_workers=5, thread_name_prefix="async_runner")
_thread_local.loop_id = new_loop_id
future = _thread_local.pool.submit(asyncio.run, coro)
return future.result()
except RuntimeError:
raise
asyncio.run(coro)

ну хотя бы так. тут по-хорошему еще мьютекса не хватает, что бы оно меняло трэды дожидаясь... и что бы чистило треды за собой... но это другая история.
тут работает по-другому - asyncio.run(coro) создаёт НОВЫЙ loop в ДРУГОМ thread

Нет deadlock потому что:

Loop A (running) → блокирует Thread A на future.result()
Loop B (new) → создаётся в Thread B, независимый от Loop A
Thread A ждёт Thread B синхронно (не через event loop)

в целом если хочется что бы корутина отработала внутри другой можно заюзать пакет nest-asyncio. но это лишняя зависимость. но она удобная.
👍3👏1
== Firebase MCP + Antigravity
https://youtu.be/DUw5xbxui6U?si=IGpfBJSGTBNsWzsd

к слову, сколько же щит-аватаров будет впереди. а у меня на них уже аллергия