Skip to content

Multiprocessing - Многопроцессное программирование в Python

Многопроцессное программирование в Python позволяет разработчикам эффективно использовать многоядерные процессоры, что особенно полезно для задач, требующих значительных вычислительных ресурсов. В Python для этого используется модуль multiprocessing, который предоставляет интерфейс для создания и управления процессами. В этой статье мы рассмотрим основные концепции и примеры использования этого модуля.

Введение в Multiprocessing

Модуль multiprocessing был разработан для преодоления ограничений Global Interpreter Lock (GIL) в Python, который позволяет выполнять только один поток в многопоточных программах. В отличие от многопоточности, многопроцессное программирование создает несколько отдельных процессов, каждый из которых имеет свой собственный интерпретатор Python и, следовательно, свой собственный GIL. Это позволяет эффективно использовать многоядерные процессоры.

Основные концепции

Process

Основной объект в multiprocessing — это Process. Он представляет собой отдельный процесс, который может выполнять функцию параллельно с основным процессом.

python
from multiprocessing import Process

def worker():
    print("Worker process")

if __name__ == '__main__':
    p = Process(target=worker)
    p.start()
    p.join()

Queue

Модуль multiprocessing также предоставляет Queue, который позволяет процессам обмениваться данными.

python
from multiprocessing import Process, Queue

def worker(q):
    q.put('Hello from worker')

if __name__ == '__main__':
    q = Queue()
    p = Process(target=worker, args=(q,))
    p.start()
    p.join()
    print(q.get())

Pool

Pool позволяет создать пул процессов, которые могут выполнять задачи параллельно.

python
from multiprocessing import Pool

def square(x):
    return x * x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(square, [1, 2, 3, 4, 5]))

Pipe

Pipe предоставляет двусторонний канал связи между процессами.

python
from multiprocessing import Process, Pipe

def worker(conn):
    conn.send('Hello from worker')
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=worker, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    p.join()

Manager

Модуль multiprocessing также предоставляет Manager, который позволяет создавать объекты, доступные из нескольких процессов.

python
from multiprocessing import Process, Manager

def worker(d, key, value):
    d[key] = value

if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
        jobs = [Process(target=worker, args=(d, i, i*2)) for i in range(5)]
        for j in jobs:
            j.start()
        for j in jobs:
            j.join()
        print(d)

Заключение

Многопроцессное программирование в Python с использованием модуля multiprocessing предоставляет мощные инструменты для создания высокопроизводительных и масштабируемых приложений. Это особенно полезно для задач, требующих интенсивных вычислений или обработки больших объемов данных. Использование Process, Queue, Pool, Pipe и Manager позволяет эффективно управлять параллельными процессами и обмениваться данными между ними.

Contacts: teffal@mail.ru