Комментарии 8
Но если тебе нужно много считать — лучше задуматься об
asyncio
илиmultiprocessing
.
Каким боком asyncio поможет в cpu-bound задаче?
Собес вы не пройдёте с таким подходом. Потоки и процессы - для CPU-bound задач. Асинхронность - для IO-bound задач. И только так. Асинхронность позволяет сразу отпустить поток, пока идёт ожидание, а многопоточность будет держать поток почём зря, пока его не переключит операционка, если решит, что он слишком долго простаивает. Потоки - не бесконечный ресурс в системе, поэтому лучше их экономить и не держать зазря. Асинхронность прекрасно с этим справляется.
Ну и чем потоки от процессов отличаются вы тоже, похоже, не очень то понимаете. Опять же собес не пройден.
Для удобства запуска можно использовать декоратор и просто ставить его перед функцией которая должна бежать в параллельном потоке. Чем это отличается от 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 непосредственно, без декораторов. Сложнее не будет, но хотя бы будет сразу видно, что создаётся поток.
Пример скачивания страниц с использованием потоков
Стоит посмотреть на PoolExecutor для таких задач. решаетмся в пару строк.
Не бойтесь потоков в Python, они не кусаются