目次
- 1 1. Panimula
- 2 2. Ano ang multiprocessing?
- 3 3. Pangunahing Sintaks ng multiprocessing Module
- 4 4. Pagbabahagi ng Data at Pag-sinkronisa
- 5 5. Pagpamahagi ng mga gawain gamit ang Process Pool
- 6 6. Pinakamainam na Paggamit ng CPU Resources
- 7 7. Mga Aktwal na Kaso ng Paggamit at Pinakamahusay na Kasanayan
- 8 8. Buod
1. Panimula
Python ay isang programming language na maraming gamit, na nagbibigay ng napakalakas na tool sa larangan ng pagproseso ng data, machine learning, at web development. Sa loob nito, ang multiprocessing module ay isang mahalagang library para maisakatuparan ang parallel processing. Sa artikulong ito, tatalakayin nang detalyado mula sa mga pangunahing gamit ng multiprocessing module ng Python hanggang sa mga advanced na aplikasyon, kasama ang mga biswal na karagdagan, at ipakikilala ang mga praktikal na teknik upang mapakawalan ang pinakamataas na performance.2. Ano ang multiprocessing?
2.1 Kahalagahan ng Parallel Processing
Python karaniwang tumatakbo sa single thread, ngunit kapag humahawak ng mabibigat na proseso o malaking datos, may hangganan ang bilis ng pagproseso gamit ang pamamaraang ito. Sa pamamagitan ng paggamit ng parallel processing, maaaring magsagawa ng maraming gawain nang sabay-sabay, magamit nang husto ang lahat ng core ng CPU, at mapabilis ang oras ng pagproseso. multiprocessing module ay nag-iwas sa GIL (Global Interpreter Lock) ng Python, at ginagawang posible ang tunay na parallel processing gamit ang maraming proseso.2.2 Pagkakaiba sa Single Thread
Sa single thread, isang proseso ang sunud-sunod na nagpapatupad ng mga gawain, ngunit sa multi-process maraming proseso ang sabay-sabay na nagpoproseso ng mga gawain. Dahil dito, lalong tumataas ang performance lalo na sa mga CPU-bound na gawain (halimbawa, malalaking kalkulasyon sa numeriko o pagsusuri ng datos).3. Pangunahing Sintaks ng multiprocessing Module
3.1 Paggamit ng Process Class
multiprocessing
Ang pangunahing gamit ng multiprocessing
module ay ang paggamit ng Process class. Sa paggamit ng class na ito, madaling makalikha ng bagong proseso at magsagawa ng sabayang pagproseso.import multiprocessing
def worker_function():
print("Naisakatuparan ang bagong proseso")
if __name__ == "__main__":
process = multiprocessing.Process(target=worker_function)
process.start()
process.join()
Sa code na ito, pinapatakbo ang worker_function
sa isang bagong proseso. Sa start()
method, sinisimulan ang proseso, at sa join()
method, naghihintay para sa pagtatapos ng proseso.3.2 Paano Magpasa ng Argumento sa Proseso
Upang magpasa ng argumento sa proseso, gamitin angargs
parameter. Sa halimbawa sa ibaba, pinapasa ang argumento sa function na worker
upang ito ay tumakbo.def worker(number):
print(f'Worker {number} ay naisakatuparan')
if __name__ == "__main__":
process = multiprocessing.Process(target=worker, args=(5,))
process.start()
process.join()
Sa ganitong paraan, maaari kang magpasa ng dynamic na data sa proseso.4. Pagbabahagi ng Data at Pag-sinkronisa
4.1 Pagbabahagi ng Data gamit ang Shared Memory
Sa multi-process, gumagamit ng Value at Array upang ligtas na magbahagi ng data sa pagitan ng mga proseso. Bilang mga shared memory object, pinapayagan nila ang maraming proseso na sabay-sabay na ma-access at ligtas na manipulahin ang data.import multiprocessing
def increment_value(shared_value):
with shared_value.get_lock():
shared_value.value += 1
if __name__ == "__main__":
shared_value = multiprocessing.Value('i', 0)
processes = [multiprocessing.Process(target=increment_value, args=(shared_value,)) for _ in range(5)]
for process in processes:
process.start()
for process in processes:
process.join()
print(f'Huling halaga: {shared_value.value}')
Ang code sa itaas ay isang halimbawa kung saan limang proseso ang sabay-sabay na nag-iincrement ng integer value sa loob ng shared memory. Ginagamit ang get_lock()
upang maiwasan ang data race.4.2 Pag-iwas sa Data Race gamit ang Lock
Kapag maraming ang sabay-sabay na nag-ooperate sa data, ginagamit ang lock mechanism upang maiwasan ang data race. Sa pamamagitan ng paggamit ng object naLock
, natitiyak ang pag-sinkronisa sa pagitan ng mga proseso.
5. Pagpamahagi ng mga gawain gamit ang Process Pool
5.1 Paggamit ng Pool class
Pool
class, kapag ginamit, maaari mong hatiin ang maraming gawain at patakbuhin ito nang sabay-sabay sa maraming proseso. Napaka-kapaki-pakinabang kapag kailangan ng malaking pagproseso ng data o pamamahagi ng gawain.from multiprocessing import Pool
def square(x):
return x * x
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.map(square, range(10))
print(results)
Sa code na ito, kinukuwenta ang parisukat ng bawat elemento ng listahan, at hinahati ito sa 4 na proseso para patakbuhin nang magkakasabay. Sa pamamagitan ng paggamit ng function na map()
, madaling maipapamahagi ang mga gawain sa mga proseso.Diagram: Pagpamahagi ng gawain gamit ang Pool class
5.2 Halimbawa ng aplikasyon: Pagproseso ng maraming argumento gamit ang starmap
starmap()
Kapag ginamit, maaaring iproseso nang sabay-sabay ang mga function na may maraming argumento. Halimbawa, maaari mong gawin ito batay sa mga pares ng argumento tulad ng sumusunod.def multiply(x, y):
return x * y
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.starmap(multiply, [(1, 2), (3, 4), (5, 6), (7, 8)])
print(results)
6. Pinakamainam na Paggamit ng CPU Resources
6.1 cpu_count()
para i-optimize ang bilang ng mga proseso
Sa pamamagitan ng paggamit ng multiprocessing.cpu_count()
ng Python, maaari mong awtomatikong makuha ang bilang ng pisikal na core ng sistema at itakda ang bilang ng mga proseso alinsunod dito. Sa ganitong paraan, maiiwasan ang labis na paglikha ng mga proseso at ma-optimize ang kabuuang pagganap ng sistema.from multiprocessing import Pool, cpu_count
if __name__ == "__main__":
with Pool(cpu_count() - 1) as pool:
results = pool.map(square, range(100))
print(results)
6.2 Epektibong Paggamit ng mga Resors ng Sistema
Iwasan ang paggamit ng lahat ng CPU core, at mag-iwan ng isang core para sa sistema, upang ma-parallelize ang mga proseso nang hindi naaapektuhan ang ibang mga gawain.7. Mga Aktwal na Kaso ng Paggamit at Pinakamahusay na Kasanayan
7.1 Konkreto na Halimbawa ng Kaso ng Paggamit
Ang multiprocessing ay epektibo sa mga sumusunod na sitwasyon.- Malawak na Pagproseso ng Data: Nakakatulong kapag nagbabasa at nagpoproseso ng maraming file nang sabay-sabay.
- Parallel Training sa Machine Learning: Pinapabilis ang pagsasanay ng modelo sa pamamagitan ng sabay-sabay na pagpapatakbo sa maraming proseso.
- Web Crawling: Maaaring mag-crawl ng maraming pahina nang sabay-sabay at epektibong mangolekta ng data.
7.2 Pinakamahusay na Kasanayan
- Optimal na Pamamahagi ng Resources: Itakda ang tamang bilang ng mga proseso batay sa bilang ng pisikal na core ng system.
- Paggamit ng Debugging at Logging: Gamitin ang
logging
module upang subaybayan ang estado ng bawat proseso at isagawa nang maayos ang error handling.
import logging
import multiprocessing
def worker_function():
logging.info(f'Proseso {multiprocessing.current_process().name} ay nagsimula')
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
process = multiprocessing.Process(target=worker_function, name='Trabahador1')
process.start()
process.join()
Sa code na ito, ginagamit ang logging
upang irekord ang mga gawain ng bawat proseso, at magawang tingnan ang mga log pagkatapos.- Pagpapatupad ng Error Handling: Sa multiprocessing, mahalaga ang error handling dahil maraming proseso ang tumatakbo nang sabay. Kahit na ang isang proseso ay biglang huminto, dapat hindi maapektuhan ang pangunahing proseso o iba pang proseso; gamitin ang try-except upang ipatupad ang error handling.
