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

Комментарии 8

Но если тебе нужно много считать — лучше задуматься об asyncio или multiprocessing.

Каким боком asyncio поможет в cpu-bound задаче?

Собес вы не пройдёте с таким подходом. Потоки и процессы - для CPU-bound задач. Асинхронность - для IO-bound задач. И только так. Асинхронность позволяет сразу отпустить поток, пока идёт ожидание, а многопоточность будет держать поток почём зря, пока его не переключит операционка, если решит, что он слишком долго простаивает. Потоки - не бесконечный ресурс в системе, поэтому лучше их экономить и не держать зазря. Асинхронность прекрасно с этим справляется.
Ну и чем потоки от процессов отличаются вы тоже, похоже, не очень то понимаете. Опять же собес не пройден.

Потоки и процессы - для CPU-bound задач.

Вы тоже не пройдёте, по Питону.

Ну ладно, GIL в Питоне надо учитывать, да. Но в целом то от языка не сильно зависит.

Для удобства запуска можно использовать декоратор и просто ставить его перед функцией которая должна бежать в параллельном потоке. Чем это отличается от asincio хз но удобно что не надо писать асинхронный код, единственное о чем надо заботится - о локах. Ну и с возвратом значений из функций есть немножко мороки, надо передавать в них контейнер.

def async_run(func):
    '''Декоратор для запуска функции в отдельном потоке, асинхронно'''
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        thread = threading.Thread(target=func, args=args, kwargs=kwargs)
        thread.start()
    return wrapper

  

Так, вы тоже не понимаете, в чём суть асинхронности, идите срочно матчасть учить )) Асинхронность будет работать даже с одним физическим потоком. Потоки ей не лишние, но суть асинхронности не в порождении потоков.

с возвратом значений из функций есть немножко мороки

Ну да, а ещё с элементартным ожиданием завершения работы функции. Потому что объект потока скрыт и даже тупой join() на нём не сделать. Нужно создавать Event в придачу к Lock. А ещё это очень неочевидно, что функция порождает поток, что может добавить веселья при её вызове в другом коде.

Короче, нужно столько инфраструктуры наворотить в функции и вокруг неё, что с тем же успехом лучше использовать Thread непосредственно, без декораторов. Сложнее не будет, но хотя бы будет сразу видно, что создаётся поток.

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