unisbadri.com » Python Java Golang Typescript Kotlin Ruby Rust Dart PHP
Multi Process

Multi Process #

Multiprocessing adalah teknik untuk menjalankan beberapa proses secara bersamaan dalam satu program, yang berguna untuk memanfaatkan kemampuan CPU multi-core. Modul multiprocessing di Python memungkinkan Anda membuat dan mengelola proses dengan cara yang mirip dengan modul threading. Berikut adalah penjelasan mendetail tentang multiprocessing di Python beserta contoh penggunaannya.

Modul multiprocessing #

Modul multiprocessing menyediakan berbagai kelas dan fungsi untuk membuat dan mengelola proses.

Kelas dan Fungsi Utama dalam multiprocessing:

  1. multiprocessing.Process: Kelas utama untuk membuat dan mengelola proses.
  2. multiprocessing.Pool: Kelas untuk membuat pool proses yang dapat digunakan untuk menjalankan fungsi secara paralel.
  3. multiprocessing.Queue: Kelas untuk berbagi data antara proses menggunakan antrian.
  4. multiprocessing.Pipe: Kelas untuk komunikasi antara proses menggunakan pipa.
  5. multiprocessing.Lock: Kelas untuk mengelola kunci (lock) yang digunakan untuk menghindari kondisi balapan (race condition).

Membuat Proses #

Anda bisa membuat proses di Python dengan dua cara utama:

  1. Membuat subkelas dari multiprocessing.Process dan menimpa metode run.
  2. Membuat instance Process dengan target fungsi.

Kelas #

import multiprocessing
import time

class MyProcess(multiprocessing.Process):
    def __init__(self, name):
        multiprocessing.Process.__init__(self)
        self.name = name

    def run(self):
        print(f"Process {self.name} starting")
        time.sleep(2)
        print(f"Process {self.name} finishing")

# Membuat dan memulai proses
process1 = MyProcess("A")
process2 = MyProcess("B")

process1.start()
process2.start()

process1.join()
process2.join()

print("All processes finished")

Fungsi #

import multiprocessing
import time

def print_hello(name):
    print(f"Process {name} starting")
    time.sleep(2)
    print(f"Process {name} finishing")

# Membuat dan memulai proses
process1 = multiprocessing.Process(target=print_hello, args=("A",))
process2 = multiprocessing.Process(target=print_hello, args=("B",))

process1.start()
process2.start()

process1.join()
process2.join()

print("All processes finished")

Paralelisme #

multiprocessing.Pool menyediakan cara yang lebih mudah untuk menjalankan fungsi secara paralel.

Pool #

import multiprocessing
import time

def square(x):
    return x * x

# Membuat pool proses
with multiprocessing.Pool(processes=4) as pool:
    results = pool.map(square, [1, 2, 3, 4, 5])

print(results)  # Output: [1, 4, 9, 16, 25]

Queue #

multiprocessing.Queue digunakan untuk berbagi data antara proses.

Penggunaan Queue #

import multiprocessing
import time

def worker(queue):
    while not queue.empty():
        item = queue.get()
        print(f"Process {multiprocessing.current_process().name} got item: {item}")
        time.sleep(1)

# Membuat antrian dan menambahkan data
queue = multiprocessing.Queue()
for item in range(5):
    queue.put(item)

# Membuat dan memulai proses
processes = []
for _ in range(2):
    process = multiprocessing.Process(target=worker, args=(queue,))
    processes.append(process)
    process.start()

for process in processes:
    process.join()

print("All processes finished")

Pipe #

multiprocessing.Pipe menyediakan cara untuk komunikasi dua arah antara proses.

Penggunaan Pipe #

import multiprocessing

def sender(pipe):
    pipe.send("Hello from sender")
    response = pipe.recv()
    print(f"Sender received: {response}")

def receiver(pipe):
    message = pipe.recv()
    print(f"Receiver got message: {message}")
    pipe.send("Hello from receiver")

# Membuat pipe
parent_conn, child_conn = multiprocessing.Pipe()

# Membuat dan memulai proses
process1 = multiprocessing.Process(target=sender, args=(parent_conn,))
process2 = multiprocessing.Process(target=receiver, args=(child_conn,))

process1.start()
process2.start()

process1.join()
process2.join()

print("All processes finished")

Race Condition #

multiprocessing.Lock digunakan untuk mengelola akses ke sumber daya yang dibagikan untuk menghindari kondisi balapan.

Penggunaan Lock #

import multiprocessing
import time

class Counter:
    def __init__(self):
        self.value = 0
        self._lock = multiprocessing.Lock()

    def increment(self):
        with self._lock:
            self.value += 1

counter = Counter()

def increment_counter(counter):
    for _ in range(100000):
        counter.increment()

process1 = multiprocessing.Process(target=increment_counter, args=(counter,))
process2 = multiprocessing.Process(target=increment_counter, args=(counter,))

process1.start()
process2.start()

process1.join()
process2.join()

print(f"Final counter value: {counter.value}")

Manager #

multiprocessing.Manager menyediakan cara untuk membuat objek yang dapat dibagi antar proses, seperti list dan dictionary.

Penggunaan Manager #

import multiprocessing

def worker(shared_list, shared_dict, lock):
    with lock:
        shared_list.append(multiprocessing.current_process().name)
        shared_dict[multiprocessing.current_process().name] = len(shared_list)

if __name__ == '__main__':
    with multiprocessing.Manager() as manager:
        shared_list = manager.list()
        shared_dict = manager.dict()
        lock = manager.Lock()

        processes = []
        for _ in range(4):
            process = multiprocessing.Process(target=worker, args=(shared_list, shared_dict, lock))
            processes.append(process)
            process.start()

        for process in processes:
            process.join()

        print(shared_list)  # Output: [Nama proses 1, Nama proses 2, ...]
        print(shared_dict)  # Output: {Nama proses 1: 1, Nama proses 2: 2, ...}

Kesimpulan #

Multiprocessing di Python memungkinkan Anda menjalankan beberapa operasi secara paralel dalam proses yang berbeda, yang sangat berguna untuk tugas-tugas CPU-bound. Dengan menggunakan modul multiprocessing, Anda dapat membuat dan mengelola proses dengan cara yang mirip dengan threading, tetapi dengan keuntungan bahwa setiap proses berjalan dalam memori terpisah, menghindari Global Interpreter Lock (GIL) yang ada di threading.

Dengan contoh-contoh di atas, Anda dapat mulai mengimplementasikan multiprocessing dalam aplikasi Python Anda untuk meningkatkan efisiensi dan performa.

« Multi Threading
Context Manager »