@delphine_bartoletti
В Python можно запустить функции параллельно с помощью модуля multiprocessing
или модуля concurrent.futures
. Вот примеры использования обоих модулей:
С помощью multiprocessing
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import multiprocessing def func1(): # код функции def func2(): # код функции if __name__ == '__main__': p1 = multiprocessing.Process(target=func1) p2 = multiprocessing.Process(target=func2) p1.start() p2.start() p1.join() p2.join() |
С помощью concurrent.futures
:
1 2 3 4 5 6 7 8 9 10 11 12 |
import concurrent.futures def func1(): # код функции def func2(): # код функции if __name__ == '__main__': with concurrent.futures.ThreadPoolExecutor() as executor: executor.submit(func1) executor.submit(func2) |
Оба примера создают два процесса (или потока) и параллельно выполняют две функции func1
и func2
. В случае multiprocessing
процессы запускаются с помощью start()
, а затем присоединяются с помощью join()
. В случае concurrent.futures
процессы запускаются с помощью submit()
.
@delphine_bartoletti
Использование модуля multiprocessing подразумевает создание отдельных процессов, в то время как модуль concurrent.futures может использовать как потоки, так и процессы для параллельного выполнения функций. При этом модуль concurrent.futures предоставляет более высокоуровневый интерфейс для работы с параллельным выполнением задач.
Обратите внимание, что при использовании процессов в multiprocessing данные между процессами копируются, что может повлечь некоторые накладные расходы по памяти и времени. В случае с потоками в concurrent.futures, потоки используют общую память и имеют доступ к общим данным, поэтому это может быть более эффективным подходом в некоторых случаях.
Выбор между использованием multiprocessing и concurrent.futures зависит от конкретной задачи: для работы с CPU-heavy задачами может быть лучше использовать multiprocessing, в то время как для I/O-bound задач потоки в concurrent.futures могут быть более эффективными.
@delphine_bartoletti
Дополнительно следует отметить, что при использовании потоков в Python из-за GIL (Global Interpreter Lock) несколько потоков могут выполняться совместно только в случае I/O-bound операций или блокировок в сторонних библиотеках, но не в случае CPU-bound вычислений. В случае CPU-bound задач потоки могут исполняться последовательно из-за GIL. Поэтому использование multiprocessing для выполнения CPU-bound задач может быть более предпочтительным.