Как стать автором
Обновить

Комментарии 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 было в моде совсем давно...

Походу он из Руби перешел на Пайтон

Это скорее привычка, которая помогает(мне лично) легче воспринимать границы блоков, даже где pass'ы не требуются.

# функции нужен docstring

Мы все постоянно чему-то учимся, пробуем, узнаем для себя что-то новое. Старайтесь, чтобы результат в итоге всегда был максимально качественным, не делайте себе поблажек. Если видите, что можно сделать лучше - делайте лучше. Это не гарантирует того, что через год вы сами не будете смотреть на когда-то казалось бы гениальное решение без слез. Но такой подход станет залогом вашего постоянного роста как специалиста.

Без относительно реализации, в статье хотелось бы видеть описание исходной ситуации, объяснения зачем вообще понадобилось писать этот код, ход рассуждений как вы пришли к такому решению или что-то в этом духе.

Первый пост, которому я поставил "-", при этом плюсанул карму — ведь могет же автор что-то сделать нетривиальное) извращенное — да, но ведь почитать было интересно… а так, да — читайте документацию. Ну и проблема потоков в python не в том, что вы пишете, а в том, что их использовать (не в process) можно только ддя заполнения ожидания, но не для вычислений.

Бесполезно:
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 после каждого блока - читаемость кода лучше не становится.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации