Комментарии 15
Товарищ, вы однако садист. Может немного окунуться в тему о синхронизации потоков, узнать о мьютексах, семафорах, очередях и т.д.? Тот же раздел Threading и concurrent.futures из документации почитать? На последний советую обратить особое внимание, т.к. лёгким движением руки заменив ThreadPoolExecutor
на ProcessPoolExecutor
можно запускать функции не в потоках, а в процессах!
Ещё желательно обязательно PEP-8.
И если идею первого декоратора (который, кстати, требует большой доработки напильником) ещё можно понять, то что до нас вы пытаетесь донести в остальной простыне кода?
Цель Thr.Env
для меня в первую очередь - реализовать механизм на подобии ThreadPoolExecutor
"своими руками", это скорее саморазвитие, или что-то в этом роде..
P.S.: Возможно, это и есть ThreadPoolExecutor, которым я никогда не пользовался. Если это так, то, возможно, просто кому-то мой метод покажется удобнее.
Ваши начинания в Питоне заслуживают лишь похвалы! Искать собственное решение и видеть его в работе приносит огромное удовольствие. Но вам не кажется, что категорично заявлять о том, что "у Питона с потоками всё плохо" может лишь человек глубоко разбирающийся в предмете?
Вы захотели поделиться с миром своими исследованиями. Отлино! Но тут ваш первый промах - вы показываете своё решение, не сравнивая его с решениями существующими. Открывая вашу статью, я ожидал увидеть:
1. Постановку задачи.
2. Существующие пути её решения и их анализ.
3. Ваше решение.
4. Сравнительный анализ.
Но вместо этого - "Удобнее чем было, так ведь?". А ведь банальное гугление "start thread in decorator" выдаёт вопрос на StackOverflow 2013го года, рецепт с ActiveState 2009го года и ещё огромную кучу материала, в котором вопрос обсасывается со всех сторон.
Куда уместнее ваш код был бы в контексте "ребята, я изучаю Питон и многопоточность и написал вот это, прокомментируйте пожалуйста".
Я надеюсь вы не принимаете вышесказанное близко к сердцу. У меня самого парочка исследовательских проектов и статей о них на Хабре, которые писались именно в таком ключе. Не мы первые, не мы последние :) Успехов вам!
Зачем везде вставлять pass? Число строк в качестве KPI было в моде совсем давно...
# функции нужен docstring
Мы все постоянно чему-то учимся, пробуем, узнаем для себя что-то новое. Старайтесь, чтобы результат в итоге всегда был максимально качественным, не делайте себе поблажек. Если видите, что можно сделать лучше - делайте лучше. Это не гарантирует того, что через год вы сами не будете смотреть на когда-то казалось бы гениальное решение без слез. Но такой подход станет залогом вашего постоянного роста как специалиста.
Без относительно реализации, в статье хотелось бы видеть описание исходной ситуации, объяснения зачем вообще понадобилось писать этот код, ход рассуждений как вы пришли к такому решению или что-то в этом духе.
Бесполезно:
def func1(a, b, c):
if a+b > c:
if a+c > b:
if b+c > a:
print("треугольник существует")
pass
pass
pass
print("треугольник не существует")
pass # возвращение значений пока не предусмотрено
В питоне есть подобный механизм, это использование asyncio и ThreadPoolExecutor или ProcessPoolExecutor. Можно настроить количество воркеров, ProcessPoolExecutor может вынести задачи в отдельный процесс для поддержки многоядерности приложением и т. д. Для глобальных переменных (что как по мне зло, и надо оборачивать грамотно контекст и прогрев кеша) можно юзать SharedMemory. Есть методы ожидания выполнения всех задач без создания цикла и механизм "запустить задачу и забыть", от чего приходится потом отказываться, так как в итоге надо проверить результат успешности выполнения фоновой задачи.
От кода повеяло Rust-ом.
Когда энергии много, а с asyncio разбираться почему-то не стал.
Код, да, хочет ревью, но отдельно хочу отметить Shlemiel the painter’s algorithm
while s[0] == ' ': s = s[1:]
while s[-1] == ' ': s = s[:-1]
Не делайте так со строками, им больно. Даже если бы не было str.strip()
Делать такое для обучения - полезно. Ну и по себе знаю, что иногда настолько лень разбираться в дебрях имеющихся инструментов, что хочется сделать что-то своё. Главное, не питать на этот счёт особых иллюзий. Но всё впечатление портит первый абзац с наездом на потоки питона, после которого идёт код, по которому напрашивается вывод о нехватке опыта или о том, что вы пришли недавно из другого языка. А такие заявления, как в первом азбаце, как по мне, можно писать только если тема действительно изучена вдоль и поперёк.
1) Разнесение трёх if-ов на шесть строк - прям перебор.
2) В func1()
print("Треугольник не существует")
будет выводиться всегда.
3) Про использование while s[0] == ' ': s = s[1:]
и while s[-1] == ' ': s = s[:-1]
вместо s.strip()
я молчу.
4) Никогда не видел, чтобы в ф-и, которая ничего не возвращает, в конце ставили pass. Если уж требуется обозначить её конец, можно возвращать None, т.е. писать просто return.
# Класс для всего содержимого либы
Не советую так делать. Питон все же не обьектно-ориентированный язык. И толку от класса никакого.
# просто полезная функция
Это не основной функционал. Лучше сделать его приватным.
Также про соблюдения pep8 и pass после каждого блока - читаемость кода лучше не становится.
Python: потоки по-другому