Читаем документацию на примере FastAPI
В жизни каждого разработчика наступает такой момент, когда найденного мануала или статьи не хватает для решения вашей задачи. Вам нужны будут какие-то хитрости, про которые в мануале ни слова. Именно в этот момент придётся обратиться к документации. Да и в целом не стоит полагаться на мнение из статьи, в которой автор мог пойти неправильным путём. Или смысл мог потеряться при переводе. Зачастую авторитетность автора сомнительна, поэтому стоит заглянуть в доку.
Посмотрим на пример качественной документации, с которой можно начать погружение в мир документаций. Речь про FastAPI — крутой асинхронный веб-фреймворк. Материал подаётся очень понятно и подробно.
При чтении документации по FastAPI не возникает вопросов, как предложенный кусок кода соотносится с написанным текстом. Всё понятно. Читается, как художественная книга, никаких wtf :)
В средней документации рассказывается "что можно сделать", но нет ответа на вопрос "как это сделать правильно". То есть показывается пример применения в вакууме, который может быть непонятно, как применить на практике. У FastAPI с этим проблем нет, рассматриваются многие практические вопросы:
— как задеплоить приложение на FastAPI с помощью докера
— как организовать полноценное приложение в связке с фронтом и базой
— как сделать авторизацию, в том числе с применением JWT-токенов
В общем, очень рекомендуем. Читайте и сразу пробуйте.
PS: У FastAPI вверху есть переключатель языка. У нас возник спор, является ли плюсом наличие перевода. За кого вы?
⚡, если читаешь доку только на английском, чтобы не было искажений от перевода.
🔥, если рад русской версии документации.
#python
В жизни каждого разработчика наступает такой момент, когда найденного мануала или статьи не хватает для решения вашей задачи. Вам нужны будут какие-то хитрости, про которые в мануале ни слова. Именно в этот момент придётся обратиться к документации. Да и в целом не стоит полагаться на мнение из статьи, в которой автор мог пойти неправильным путём. Или смысл мог потеряться при переводе. Зачастую авторитетность автора сомнительна, поэтому стоит заглянуть в доку.
Посмотрим на пример качественной документации, с которой можно начать погружение в мир документаций. Речь про FastAPI — крутой асинхронный веб-фреймворк. Материал подаётся очень понятно и подробно.
При чтении документации по FastAPI не возникает вопросов, как предложенный кусок кода соотносится с написанным текстом. Всё понятно. Читается, как художественная книга, никаких wtf :)
В средней документации рассказывается "что можно сделать", но нет ответа на вопрос "как это сделать правильно". То есть показывается пример применения в вакууме, который может быть непонятно, как применить на практике. У FastAPI с этим проблем нет, рассматриваются многие практические вопросы:
— как задеплоить приложение на FastAPI с помощью докера
— как организовать полноценное приложение в связке с фронтом и базой
— как сделать авторизацию, в том числе с применением JWT-токенов
В общем, очень рекомендуем. Читайте и сразу пробуйте.
PS: У FastAPI вверху есть переключатель языка. У нас возник спор, является ли плюсом наличие перевода. За кого вы?
⚡, если читаешь доку только на английском, чтобы не было искажений от перевода.
🔥, если рад русской версии документации.
#python
Tiangolo
FastAPI in Containers - Docker - FastAPI
FastAPI framework, high performance, easy to learn, fast to code, ready for production
⚡30🔥26❤2👍2🌭2
Подборка базовых материалов для python-разработчиков на 2022 год
Современная разработка требует не только знания языка программирования. Нужно знать язык, типы данных, фреймворки, базы данных, подходы к тестированию, linux и вообще кучу инструментов вроде docker. Совершенно не лишним будут книги, собирающие большую разнородную информацию в понятном и последовательном виде.
Мы сформировали подборку бесплатных материалов из разных областей, которые гарантированно нужны разработчику. Опубликовали на pikabu и VC, кому как удобнее. Поддержите лайком, если годно.
Не нашли крутых материалов для начинающих по Linux. Если знаете такие, поделитесь в комментариях. Планируем ещё несколько подборок по специализациям.
#python #devfm
Современная разработка требует не только знания языка программирования. Нужно знать язык, типы данных, фреймворки, базы данных, подходы к тестированию, linux и вообще кучу инструментов вроде docker. Совершенно не лишним будут книги, собирающие большую разнородную информацию в понятном и последовательном виде.
Мы сформировали подборку бесплатных материалов из разных областей, которые гарантированно нужны разработчику. Опубликовали на pikabu и VC, кому как удобнее. Поддержите лайком, если годно.
Не нашли крутых материалов для начинающих по Linux. Если знаете такие, поделитесь в комментариях. Планируем ещё несколько подборок по специализациям.
#python #devfm
Пикабу
Ответ trdm в «Яндекс и "Цифровые профессии"»
Автор: anetto1502
🔥15👍4⚡2❤1🌭1
Регулярные выражения в Python от простого к сложному
В статье рассказывается:
— о регулярных выражениях вообще
— их плюсах в виде крутого инструмента для решения задач
— их минусах в виде write-only кода и других нюансах
— о базовом синтаксисе
— о применении регулярок в питоне с кучей примеров
— о разных сложных конструкциях
Приведены интересные задачи с примерами входных и выходных данных для практики в реализации своих регулярных выражений. Прорешайте задачи, чтобы пополнить копилку своих скиллов.
Недавно мы предлагали удобный сервис для проверки регулярок regex101.
#python #skills
В статье рассказывается:
— о регулярных выражениях вообще
— их плюсах в виде крутого инструмента для решения задач
— их минусах в виде write-only кода и других нюансах
— о базовом синтаксисе
— о применении регулярок в питоне с кучей примеров
— о разных сложных конструкциях
Приведены интересные задачи с примерами входных и выходных данных для практики в реализации своих регулярных выражений. Прорешайте задачи, чтобы пополнить копилку своих скиллов.
Недавно мы предлагали удобный сервис для проверки регулярок regex101.
#python #skills
Хабр
Регулярные выражения в Python от простого к сложному. Подробности, примеры, картинки, упражнения
Регулярные выражения в Python от простого к сложному Решил я давеча моим школьникам дать задачек на регулярные выражения для изучения. А к задачкам нужна какая-нибудь теория. И стал я искать хорошие...
❤3👍3🌭2⚡1🔥1
Ищем свой пароль в файле размером 37 Гб на Python
Статья Has your password been pwned? Or, how I almost failed to search a 37 GB text file in under 1 millisecond примечательна по нескольким причинам.
Автор начинает статью с упоминания известного сайта have i been pwned, где можно проверить наличие вашего пароля в слитых базах. И озвучивает интересную мысль: если до проверки пароля в базах не было, то после проверки он уже точно там есть.
Далее начинается захватывающее чтиво. Автор проявляет невероятную смекалку для достижения своей цели — локально проверить свой пароль в файле размером 37 Гб за 1 миллисекунду.
Но не всё так сразу. На первый взгляд, поставленная задача кажется вообще не решаемой. Поэтому подходить к решению нужно итеративно. Начинается всё с банального поиска в лоб. Этот способ, конечно, рабочий, но медленный. Следующий шаг, чтобы улучшить результат — погружение в специфику задачи. Автор применяет различные приемы: свойства хешей, алгоритмы поиска, структуры данных и в результате решает поставленную задачу!
Откровенно говоря, для понимания решения придётся очень вдумчиво посидеть.
Такой итеративный подход стоит применять для всех сложных задач. Не нужно с первого раза пытаться изобретать космолёт, чаще всего он и не нужен. Как писал Дональд Кнут, преждевременная оптимизация — корень всех зол.
Слона нужно есть по частям. Начинаем с простого, но работающего решения. Критически смотрим на полученное решение. Если что-то не устраивает, то ищем "бутылочное горлышко" и оптимизируем его.
И еще одна приятность статьи — в процессе повествования автор оставляет множество интересных ссылок для изучения.
#python
Статья Has your password been pwned? Or, how I almost failed to search a 37 GB text file in under 1 millisecond примечательна по нескольким причинам.
Автор начинает статью с упоминания известного сайта have i been pwned, где можно проверить наличие вашего пароля в слитых базах. И озвучивает интересную мысль: если до проверки пароля в базах не было, то после проверки он уже точно там есть.
Далее начинается захватывающее чтиво. Автор проявляет невероятную смекалку для достижения своей цели — локально проверить свой пароль в файле размером 37 Гб за 1 миллисекунду.
Но не всё так сразу. На первый взгляд, поставленная задача кажется вообще не решаемой. Поэтому подходить к решению нужно итеративно. Начинается всё с банального поиска в лоб. Этот способ, конечно, рабочий, но медленный. Следующий шаг, чтобы улучшить результат — погружение в специфику задачи. Автор применяет различные приемы: свойства хешей, алгоритмы поиска, структуры данных и в результате решает поставленную задачу!
Откровенно говоря, для понимания решения придётся очень вдумчиво посидеть.
Такой итеративный подход стоит применять для всех сложных задач. Не нужно с первого раза пытаться изобретать космолёт, чаще всего он и не нужен. Как писал Дональд Кнут, преждевременная оптимизация — корень всех зол.
Слона нужно есть по частям. Начинаем с простого, но работающего решения. Критически смотрим на полученное решение. Если что-то не устраивает, то ищем "бутылочное горлышко" и оптимизируем его.
И еще одна приятность статьи — в процессе повествования автор оставляет множество интересных ссылок для изучения.
#python
death and gravity
Has your password been pwned? Or, how I almost failed to search a 37 GB text file in under 1 millisecond (in Python)
... in which we check if your password has been compromised in many inconvenient ways, in a tale of destruction, obsession, and self-discovery.
🔥10👍4❤1⚡1🌭1
Behavior Driven Development
BDD — методология разработки "через поведение". Серия статей по BDD позволит достаточно глубоко разобраться в теме.
Для ознакомления с BDD можно прочесть первую статью. Во второй статье автор рассказывает про Gherkin Language — язык описания сценариев поведения. Далее в цикле статья с примерами написания сценариев и рекомендациями по написанию подобных сценариев.
У автора есть также более прикладная статья — применение BDD на питоне, где можно посмотреть практические аспекты.
А закончить стоит примером настоящего проекта, где применяется BDD. Ребята уже давно разрабатывают консольный task manager (пример BDD тестов). Код несложный, можно достаточно быстро разобраться что к чему.
#python
BDD — методология разработки "через поведение". Серия статей по BDD позволит достаточно глубоко разобраться в теме.
Для ознакомления с BDD можно прочесть первую статью. Во второй статье автор рассказывает про Gherkin Language — язык описания сценариев поведения. Далее в цикле статья с примерами написания сценариев и рекомендациями по написанию подобных сценариев.
У автора есть также более прикладная статья — применение BDD на питоне, где можно посмотреть практические аспекты.
А закончить стоит примером настоящего проекта, где применяется BDD. Ребята уже давно разрабатывают консольный task manager (пример BDD тестов). Код несложный, можно достаточно быстро разобраться что к чему.
#python
👍5⚡1❤1🔥1🌭1
FastAPI best practices
В любом языке программирования или фреймворке есть хорошие практики. Эти практики редко содержатся в доке. Обычно они вырабатываются сообществом на реальных проектах кровью и потом. Мы уже писали о качественной документация FastAPI, которая читается на одном дыхании.
Дополним документацию замечательным репозиторием, где собран набор из 24 советов по разработке на FastAPI. Некоторые кажутся банальными, но все точно заслуживают внимания. Все пункты подробно описаны и содержат примеры кода.
Из не совсем очевидного и полезного можно отметить:
— 8 п. глобальная Base Model с нужным конфигом
— 9 п. правильная генерация документации для сваггера и отключение ее на проде
— 12 п. настройка шаблонных и человекочитаемых имен для миграций
— 21 п. использование ValueError в своих кастомных пидантик валидаторах
Что стоит принять к сведению:
— 18 п. при использовании union в пидантике нужно быть уверенным, что валидатор знает разницу между типами
— 22 п. не забывать, как именно и в каком порядке Fast API работает с объектами пидантика и контроллера
— 13 п. соблюдать единые правила для именования сущностей базы данных
#python
В любом языке программирования или фреймворке есть хорошие практики. Эти практики редко содержатся в доке. Обычно они вырабатываются сообществом на реальных проектах кровью и потом. Мы уже писали о качественной документация FastAPI, которая читается на одном дыхании.
Дополним документацию замечательным репозиторием, где собран набор из 24 советов по разработке на FastAPI. Некоторые кажутся банальными, но все точно заслуживают внимания. Все пункты подробно описаны и содержат примеры кода.
Из не совсем очевидного и полезного можно отметить:
— 8 п. глобальная Base Model с нужным конфигом
— 9 п. правильная генерация документации для сваггера и отключение ее на проде
— 12 п. настройка шаблонных и человекочитаемых имен для миграций
— 21 п. использование ValueError в своих кастомных пидантик валидаторах
Что стоит принять к сведению:
— 18 п. при использовании union в пидантике нужно быть уверенным, что валидатор знает разницу между типами
— 22 п. не забывать, как именно и в каком порядке Fast API работает с объектами пидантика и контроллера
— 13 п. соблюдать единые правила для именования сущностей базы данных
#python
GitHub
GitHub - zhanymkanov/fastapi-best-practices: FastAPI Best Practices and Conventions we used at our startup
FastAPI Best Practices and Conventions we used at our startup - zhanymkanov/fastapi-best-practices
❤6👍5⚡2🔥1🌭1
Зелёные потоки в Python
Переключение между потоками — процесс очень затратный по времени, как мы уже разбирали. Для решения этой проблемы были придуманы зелёные потоки (green threads, они же coroutines или корутины), у которых вместо честного переключения потоков операционной системой реализуется виртуальное переключение потоков в пользовательском пространстве. Для IO-bound задач, где бутылочным горлышком являются медленные операции ввода-вывода, в том числе сетевого, зелёные потоки являются спасением. Для CPU-bound задач, где надо много физически вычислять на процессоре и нет простоев зелёные потоки не нужны.
Предлагаем прочитать статью Асинхронный python без головной боли (часть вторая). Начинается статья с наглядного примера асинхронности из жизни. Часто у начинающих разработчиков можно наблюдать ошибку, когда вместо подписки на событие, например, изменения файла, реализуется "жужжалка", которая в бесконечном цикле дёргает метаданные файла, загружая CPU на 100%.
Дальше на примере показывается async-await с разными нюансами, в том числе с необходимостью асинхронных функций. Потом показывается взаимосвязь корутин и генераторов, асинхронные контекстные менеджеры и приложение, которое асинхронно что-то делает с сервисом погоды.
Во второй части речь про event loop, про пример с API gateway, дополнение сервиса погоды переводчиком, асинхронным логгированием и базой.
#python
Переключение между потоками — процесс очень затратный по времени, как мы уже разбирали. Для решения этой проблемы были придуманы зелёные потоки (green threads, они же coroutines или корутины), у которых вместо честного переключения потоков операционной системой реализуется виртуальное переключение потоков в пользовательском пространстве. Для IO-bound задач, где бутылочным горлышком являются медленные операции ввода-вывода, в том числе сетевого, зелёные потоки являются спасением. Для CPU-bound задач, где надо много физически вычислять на процессоре и нет простоев зелёные потоки не нужны.
Предлагаем прочитать статью Асинхронный python без головной боли (часть вторая). Начинается статья с наглядного примера асинхронности из жизни. Часто у начинающих разработчиков можно наблюдать ошибку, когда вместо подписки на событие, например, изменения файла, реализуется "жужжалка", которая в бесконечном цикле дёргает метаданные файла, загружая CPU на 100%.
Дальше на примере показывается async-await с разными нюансами, в том числе с необходимостью асинхронных функций. Потом показывается взаимосвязь корутин и генераторов, асинхронные контекстные менеджеры и приложение, которое асинхронно что-то делает с сервисом погоды.
Во второй части речь про event loop, про пример с API gateway, дополнение сервиса погоды переводчиком, асинхронным логгированием и базой.
#python
Telegram
DevFM
Программа vs процесс vs поток
В 4-минутном видео Process vs Thread раскрывается популярный на собеседовании вопрос из заголовка. Программа с диска в момент запуска становится процессом, а в процессе может быть один и более поток с общим адресным пространством.…
В 4-минутном видео Process vs Thread раскрывается популярный на собеседовании вопрос из заголовка. Программа с диска в момент запуска становится процессом, а в процессе может быть один и более поток с общим адресным пространством.…
👍7❤3⚡3🌭1
Покоряем большие CSV
Классная практическая статья Working with large CSV files in Python from Scratch рассказывает о хитростях работы с большими CSV-файлами.
В статье рассматриваются примеры:
— подсчёт строк в большом файле. Для этого применяется mmap, который использует низкоуровневое API операционной системы. Это позволяет ускорить чтение большого файла. Сам mmap заслуживает отдельной статьи. В ней с примерами на питоне объясняется, откуда берётся ускорение, плюс другие интересности, в том числе уровня системных вызовов ядра
— разбиение большого файла на части, с которыми дальше удобнее работать
— перемешивание строк в файле. Такое бывает нужно, когда данные используются для обучения модельки машинного обучения
— хранение в виде столбцов ускорит выполнение запросов путём ограничения данных, среди которых идет поиск. Этот пункт достаточно хардкорный, рекомендуем пройтись отладчиком по коду — иначе не разобраться в нюансах
Мы на практике неоднократно сталкивались с гигабайтными CSV, которые иногда даже не умещались в оперативную память.
Например, вы знаете, что линуксовый sort --unique читает файл целиком в оперативную память? А для работы ему надо примерно в 2,5 раза больше памяти, чем весит исходный файл. То есть для сортировки файла в 10 гигов нужно около 25 гигов оперативной памяти. Решение этой проблемы заслуживает отдельного поста.
#python
Классная практическая статья Working with large CSV files in Python from Scratch рассказывает о хитростях работы с большими CSV-файлами.
В статье рассматриваются примеры:
— подсчёт строк в большом файле. Для этого применяется mmap, который использует низкоуровневое API операционной системы. Это позволяет ускорить чтение большого файла. Сам mmap заслуживает отдельной статьи. В ней с примерами на питоне объясняется, откуда берётся ускорение, плюс другие интересности, в том числе уровня системных вызовов ядра
— разбиение большого файла на части, с которыми дальше удобнее работать
— перемешивание строк в файле. Такое бывает нужно, когда данные используются для обучения модельки машинного обучения
— хранение в виде столбцов ускорит выполнение запросов путём ограничения данных, среди которых идет поиск. Этот пункт достаточно хардкорный, рекомендуем пройтись отладчиком по коду — иначе не разобраться в нюансах
Мы на практике неоднократно сталкивались с гигабайтными CSV, которые иногда даже не умещались в оперативную память.
Например, вы знаете, что линуксовый sort --unique читает файл целиком в оперативную память? А для работы ему надо примерно в 2,5 раза больше памяти, чем весит исходный файл. То есть для сортировки файла в 10 гигов нужно около 25 гигов оперативной памяти. Решение этой проблемы заслуживает отдельного поста.
#python
Medium
Working with large CSV files in Python from Scratch
5 Techniques
👍7🔥4⚡3🌭2❤1
Python import: Advanced Techniques and Tips
Импорты в питоне могут стать головной болью начинающего разработчика, особенно при переходе от запуска в IDE разработчика на чужую машину. Полезно один раз детально разобраться в этой теме. В статье рассматриваются разные вопросы работы с пакетами в питоне. Доступен перевод в двух частях: часть 1, часть 2.
Начинается статья с базового описания модуля как пространства имён и применения dir для его исследования. Далее объединение модулей в пакет и разные варианты импорта.
В статье также подробно освещаются следующие темы:
— абсолютные и относительные импорты. На практике относительные импорты — зло, PEP8 рекомендует применять абсолютные импорты в большинстве ситуаций
— import path и порядок поиска модулей
— создании своего пакета для PyPI. Классический setup.py, плюс установка изменяемого пакета для удобной разработки без необходимости переустановки. Интересным дополнением является включение ресурсов или данных в пакет на примере иконок для GUI-приложения
— динамические импорты, которые позволяют перезагружать модули во время работы приложения. Такой способ позволяет реализовать плагинную структуру путём подключения произвольных модулей с кодом на лету
— перезагрузку модулей. Проблема в том, что повторный импорт не приводит к перечитыванию модуля, по факту используется старая версия. Для перезагрузки модуля надо использовать importlib.reload. Этот и предыдущий пункты позволяют вместе организовать динамические плагины в проекте
— работу с разными модулями в зависимости от доступности библиотек или версии интерпретатора. Это позволяет применять разные библиотеки. Нет bokeh для визуализации? Используем matplotlib. Не все фичи будут доступны, но будет работать
— использование профилировщика для импортов. На нашей практике, импорты не становились узким местом приложения. Но если важна скорость старта скрипта, знание о профилировании импортов будет полезным
Заход на правильную организацию импортов был в посте об анализаторах кода.
#python
Импорты в питоне могут стать головной болью начинающего разработчика, особенно при переходе от запуска в IDE разработчика на чужую машину. Полезно один раз детально разобраться в этой теме. В статье рассматриваются разные вопросы работы с пакетами в питоне. Доступен перевод в двух частях: часть 1, часть 2.
Начинается статья с базового описания модуля как пространства имён и применения dir для его исследования. Далее объединение модулей в пакет и разные варианты импорта.
В статье также подробно освещаются следующие темы:
— абсолютные и относительные импорты. На практике относительные импорты — зло, PEP8 рекомендует применять абсолютные импорты в большинстве ситуаций
— import path и порядок поиска модулей
— создании своего пакета для PyPI. Классический setup.py, плюс установка изменяемого пакета для удобной разработки без необходимости переустановки. Интересным дополнением является включение ресурсов или данных в пакет на примере иконок для GUI-приложения
— динамические импорты, которые позволяют перезагружать модули во время работы приложения. Такой способ позволяет реализовать плагинную структуру путём подключения произвольных модулей с кодом на лету
— перезагрузку модулей. Проблема в том, что повторный импорт не приводит к перечитыванию модуля, по факту используется старая версия. Для перезагрузки модуля надо использовать importlib.reload. Этот и предыдущий пункты позволяют вместе организовать динамические плагины в проекте
— работу с разными модулями в зависимости от доступности библиотек или версии интерпретатора. Это позволяет применять разные библиотеки. Нет bokeh для визуализации? Используем matplotlib. Не все фичи будут доступны, но будет работать
— использование профилировщика для импортов. На нашей практике, импорты не становились узким местом приложения. Но если важна скорость старта скрипта, знание о профилировании импортов будет полезным
Заход на правильную организацию импортов был в посте об анализаторах кода.
#python
Realpython
Python import: Advanced Techniques and Tips – Real Python
The Python import system is as powerful as it is useful. In this in-depth tutorial, you'll learn how to harness this power to improve the structure and maintainability of your code.
❤5👍4🌭2⚡1🔥1
Многопоточный Python на примерах: избавляемся от дедлоков
Многопоточное программирование — это непросто. Самое неприятное — схватить дедлок, то есть взаимную блокировку потоков, когда поток 1 занял ресурс А и пытается захватить ресурс Б, а в это же время поток 2 занял ресурс Б и пытается захватить А. В этом случае потоки взаимно блокируют друг друга.
В статье от Озона с помощью графа ожидания в рантайме определяются дедлоки. Подмечены такие важные штуки, как накладные расходы от поиска дедлоков и минусы глобальной блокировки на сам граф ожидания, которые увеличивают долю последовательного кода и, привет, закон Амдала.
Примеры кода в статье взяты из небольшой опенсорсной библиотеки locklib. На заметку начинающим разработчикам — читать чужой код очень полезно. А тут приятное с полезным, автор разбирает чужой код за нас, дополняя его теорией.
По замерам автора, блокировка с проверкой на дедлоки в 10 раз медленнее, чем штатный питоновский threading.Lock. Такое замедление может оказаться неприятным, поэтому используйте с осторожностью.
Возможно, для вашей задачи лучше использовать асинхронное программирование. Очень важно понимать, какой класс проблем решается асинхронщиной, а какой — многопоточностью.
#python
Многопоточное программирование — это непросто. Самое неприятное — схватить дедлок, то есть взаимную блокировку потоков, когда поток 1 занял ресурс А и пытается захватить ресурс Б, а в это же время поток 2 занял ресурс Б и пытается захватить А. В этом случае потоки взаимно блокируют друг друга.
В статье от Озона с помощью графа ожидания в рантайме определяются дедлоки. Подмечены такие важные штуки, как накладные расходы от поиска дедлоков и минусы глобальной блокировки на сам граф ожидания, которые увеличивают долю последовательного кода и, привет, закон Амдала.
Примеры кода в статье взяты из небольшой опенсорсной библиотеки locklib. На заметку начинающим разработчикам — читать чужой код очень полезно. А тут приятное с полезным, автор разбирает чужой код за нас, дополняя его теорией.
По замерам автора, блокировка с проверкой на дедлоки в 10 раз медленнее, чем штатный питоновский threading.Lock. Такое замедление может оказаться неприятным, поэтому используйте с осторожностью.
Возможно, для вашей задачи лучше использовать асинхронное программирование. Очень важно понимать, какой класс проблем решается асинхронщиной, а какой — многопоточностью.
#python
Хабр
Многопоточный Python на примерах: избавляемся от дедлоков
Дедлоки — распространенная проблема в многопоточном программировании. В больших приложениях вручную отслеживать порядок блокировок может быть достаточно сложно, причем эта проблема может не...
⚡7❤3🌭3👍2