1. Panimula

Kahalagahan ng Parallel Processing sa Python

Ang Python ay isang simpleng at madaling gamitin na programming language na ginagamit sa maraming layunin. Gayunpaman, kapag kinakailangan ng komplikadong pagproseso ng data o kalkulasyon, ang bilis ng pagproseso ng Python ay maaaring maging hamon. Upang malutas ito, ang “parallel processing” na nagpapahintulot sa sabay-sabay na pagpapatakbo ng maraming gawain ay may mahalagang papel. Sa artikulong ito, tatalakayin kung paano magpatupad ng parallel processing sa Python, mula sa mga pangunahing pamamaraan hanggang sa mga tiyak na use case.

2. Mga paraan ng parallel processing sa Python

Mga pangunahing paraan ng parallel processing

May ilang paraan ang Python para maisakatuparan ang parallel processing. Ang mga pangunahing ito ay ang tatlong sumusunod.
  1. Multi-threading (threading module) Gumagamit ng maraming thread upang isagawa ang mga gawain nang magkasabay, ngunit dahil sa epekto ng Python GIL (Global Interpreter Lock), limitado ang bisa nito para sa mga gawain na gumagamit ng maraming CPU.
  2. Multi-process (multiprocessing module) Dahil ang bawat proseso ay may sariling memory space, hindi ito apektado ng GIL, kaya posible ang tunay na parallel processing. Angkop ito para sa malakihang pagproseso ng data at mabibigat na kalkulasyon.
  3. Asynchronous processing (asyncio module) Ang asynchronous processing ay epektibo para sa mga I/O-bound na gawain (tulad ng network communication at file operations). Sa ganitong paraan, maaaring maisakatuparan nang epektibo ang mga prosesong may maraming oras ng paghihintay.
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. Multi-proseso vs Multi-thread

Epekto ng GIL (Global Interpreter Lock)

May mekanismo sa Python na tinatawag na GIL, na naglilimita sa sabay-sabay na pagpapatakbo sa iisang thread lamang. Ito ang dahilan kung bakit sa mga CPU-bound na gawain, hindi tumataas ang performance kahit na magdagdag ng mga thread. Dahil dito, ang parallel processing gamit ang mga thread ay epektibo lamang sa mga I/O-bound na gawain na may maraming oras ng paghihintay.

Mga Benepisyo at Limitasyon ng Multi-thread

Ang mga thread ay magaan at angkop para sa mga I/O-bound na gawain (tulad ng paghawak ng file o network processing). Gayunpaman, dahil sa nabanggit na GIL, hindi magagamit nang buo ang maraming CPU core, kaya hindi ito angkop para sa mga CPU-bound na gawain.
import threading
import time

def worker(num):
print(f"Worker {num} starting")
time.sleep(2)
print(f"Worker {num} finished")

threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.start()

for t in threads:
t.join()
Ang code na ito ay nagpapatakbo ng 5 thread nang sabay-sabay, at bawat isa ay nagtatapos matapos ang 2 segundo ng pagtulog. Sa pamamagitan ng paggamit ng multi-thread, makikita mo kung paano nagkakaganap nang sabay-sabay ang mga gawain.

Mga Benepisyo ng Multi-proseso

Upang maiwasan ang limitasyon ng GIL, epektibo ang multi-proseso. Ang mga proseso ay iba sa mga thread dahil may sariling memory space, kaya maaaring magamit nang buo ang maraming CPU core. Lalo na kapaki-pakinabang ito sa mabibigat na kalkulasyon o paghawak ng malalaking datos.
from multiprocessing import Process
import time

def worker(num):
print(f"Worker {num} starting")
time.sleep(2)
print(f"Worker {num} finished")

if name == 'main':
processes = []
for i in range(5):
p = Process(target=worker, args=(i,))
processes.append(p)
p.start()

for p in processes:
    p.join()
Sa halimbawang ito, 5 proseso ang tumatakbo nang sabay-sabay, at bawat isa ay nagsasagawa ng sariling gawain. Ang join() method ay naghihintay hanggang sa matapos ang bawat proseso, kaya hindi magpapatuloy ang programa hanggang sa makumpleto ang lahat ng proseso.

4. Paano magpatupad ng parallel processing sa Python

Parallel processing gamit ang multiprocessing module

Kapag ginagamit ang multiprocessing module, maaari mong epektibong pamahalaan ang maraming proseso. Narito ang isang pangunahing halimbawa ng paggamit ng process pool para magproseso ng mga gawain nang parallel.
from multiprocessing import Pool

def square(x):
return x * x

if name == 'main':
with Pool(4) as p:
result = p.map(square, [1, 2, 3, 4, 5])
print(result)
Sa code na ito, apat na proseso ang sabay-sabay na tumatakbo, at bawat isa ay nagsasagawa ng square calculation sa mga elemento ng listahan. Ang resulta ay ibinabalik bilang listahan, na nagpapakita ng kahusayan ng parallel processing.

5. Asynchronous na Pagproseso at ang mga Gamit Nito

Asynchronous na Pagproseso gamit ang asyncio module

asyncio ay partikular na angkop para sa mga task na may I/O na paghihintay. Ang mga proseso tulad ng network communication at file input/output ay maaaring maisakatuparan nang mas epektibo sa pamamagitan ng pagsabay-sabay na pagproseso ng ibang mga task habang naghihintay.
import asyncio

async def worker(num):
print(f'Worker {num} starting')
await asyncio.sleep(1)
print(f'Worker {num} finished')

async def main():
tasks = [worker(i) for i in range(5)]
await asyncio.gather(*tasks)

asyncio.run(main())
Ang code na ito ay nagpapatakbo ng limang task nang sabay-sabay. Sa paggamit ng await, isinasagawa ang asynchronous na pagproseso, at ang ibang mga task ay tumatakbo habang ang bawat task ay naghihintay.

6. Pag-optimize ng Performance ng Parallel Processing

Parallelization gamit ang Joblib

Joblib ay isang library na nag-eefisiyensya ng mabibigat na kalkulasyon tulad ng pagproseso ng data at pagsasanay ng mga modelo ng machine learning. Ang sumusunod na code ay halimbawa ng paggamit ng Joblib para sa parallel processing.
from joblib import Parallel, delayed

def heavy_task(n):
return n ** 2

results = Parallel(n_jobs=4)(delayed(heavy_task)(i) for i in range(10))
print(results)
Sa pamamagitan ng pagtukoy ng n_jobs, maaari mong kontrolin ang bilang ng mga prosesong isasagawa nang sabay. Sa halimbawang ito, isinasagawa ang kalkulasyon nang parallel gamit ang 4 na proseso, at ibinabalik ang resulta bilang isang listahan.

7. Praktikal na mga Aplikasyon ng Parallel Processing sa Python

Pagproseso ng Data at Web Scraping

Ang parallel processing sa Python ay lalo na epektibo sa mga sitwasyon kung saan maraming data ang pinoproseso nang sabay, tulad ng pagproseso ng data at web scraping. Halimbawa, kapag nag-crawl ng mga web page, maaaring gumamit ng multi-threading o asynchronous processing upang magsabay-sabay na magpadala ng maraming kahilingan, na nagreresulta sa malaking pag-ikli ng oras ng pagproseso. Bukod pa rito, sa training ng machine learning at pre-processing ng data, maaaring mapabuti ang performance sa pamamagitan ng paggamit ng multiprocessing at Joblib.

8. Buod

Ang parallel processing ay isang mahalagang teknolohiya upang makuha ang pinakamataas na pagganap ng Python. threading, multiprocessing, asyncio, at Joblib na mga module ay maaaring gamitin nang tama upang epektibong iproseso ang mga gawain sa iba’t ibang sitwasyon. Gamitin ang mga teknolohiyang ito sa mga totoong proyekto at magsikap na mapabuti ang kahusayan ng pagproseso.