[python] λ©ν°νλ‘μΈμ± Pool μ¬μ©λ² λ° μ½λ μμ | multiprocessing.Pool | python μλ ν₯μ
λ©ν°νλ‘μΈμ±μ μ¬λ¬ κ°μ λ 립μ μΈ νλ‘μΈμ€λ₯Ό μμ±νμ¬ κ°κ°μ νλ‘μΈμ€κ° λ³λ ¬λ‘ μμ νλλ‘ νλ λ°©μμ΄λ€. κ° νλ‘μΈμ€λ λ 립μ μΈ λ©λͺ¨λ¦¬ 곡κ°μ κ°μ§λ©°, νλ‘μΈμ€ κ° ν΅μ (Inter-Process Co
mvje.tistory.com
νμ΄μ¬μμ λ©ν°νλ‘μΈμ±μ ꡬννκΈ° μν΄ multiprocessing λͺ¨λμ μ¬μ©ν μ μμΌλ©°, μ΄ μ€ λνμ μΈ λ°©μμΌλ‘ multiprocessing.Poolκ³Ό multiprocessing.Processκ° μλ€. μ΄μ ν¬μ€ν μμλ Poolμ μ€μ¬μΌλ‘ μ¬μ©νλ λ°©λ²μ μ΄ν΄λ³΄μκ³ , μ΄λ²μλ Processλ₯Ό μ§μ μ¬μ©νλ λ°©μκ³Ό ν¨κ» λ λ°©μμ μ°¨μ΄μ μ λΉκ΅ν΄λ³΄λ € νλ€.
Poolκ³Ό Processλ λ©ν°νλ‘μΈμ±μ ꡬννλ λ κ°μ§ μ κ·Ό λ°©μμΌλ‘, μν©μ λ°λΌ λ μ ν©ν λ°©μμ΄ λ¬λΌμ§ μ μλ€. νΉν κ° νλ‘μΈμ€μ μλ‘ λ€λ₯Έ μμ μ ν λΉν΄μΌ νλ κ²½μ°μλ Processλ₯Ό μ§μ μ¬μ©νλ κ²μ΄ μ 리νλ€.
π multiprocessing.Pool
β
κ°νΈν μΈν°νμ΄μ€
Pool ν΄λμ€λ μ¬λ¬ κ°μ νλ‘μΈμ€λ₯Ό μμ±νκ³ , κ° νλ‘μΈμ€μ μμ
μ λΆλ°°νλ κ³Όμ μ κ°λ¨νκ² λ§λ€μ΄μ€λ€. λμΌν ν¨μλ₯Ό μ¬λ¬ μ
λ ₯κ°μ λ³λ ¬λ‘ μ μ©ν λ νΉν νΈλ¦¬νλ€.
β
μμ
λΆλ°° μλν
map, imap, apply λ±μ λ©μλλ₯Ό μ¬μ©νλ©΄ μ
λ ₯ λ°μ΄ν°λ₯Ό μλμΌλ‘ λλ μ¬λ¬ νλ‘μΈμ€μ λΆμ°μν€κ³ , κ²°κ³Όλ₯Ό λ³ν©νλ μμ
κΉμ§ λ΄λΆμ μΌλ‘ μ²λ¦¬λλ€.
β
νλ‘μΈμ€ μ μ μ΄
Pool(processes=n) ννλ‘ μμ± μ μ¬μ©ν νλ‘μΈμ€μ κ°μλ₯Ό μ§μ ν μ μλ€. μ΄λ CPU μ½μ΄ μ λλ λ³λ ¬μ²λ¦¬ν μμ
μμ λ°λΌ μ‘°μ ν μ μλ€.
# μ½λ μμ
from multiprocessing import Pool
def square_number(x):
return x ** 2
if __name__ == "__main__":
data = [1, 2, 3, 4, 5]
with Pool(processes=3) as pool:
results = pool.map(square_number, data)
print("Results:", results)
π multiprocessing.Process
β
μΈλ°ν μ μ΄κ° νμν κ²½μ°μ μ ν©
Process ν΄λμ€λ₯Ό μ¬μ©νλ©΄ κ° νλ‘μΈμ€λ₯Ό λͺ
μμ μΌλ‘ μμ±νκ³ , μμ(start()), μ’
λ£(terminate()), λκΈ°(join()) λ±μ λμμ μΈλ°νκ² μ μ΄ν μ μλ€. μμ
νλ¦μ μ§μ κ΄λ¦¬ν΄μΌ νμ§λ§, κ·Έλ§νΌ μ μ°νκ² μ€κ³ν μ μλ€λ μ₯μ μ΄ μλ€.
β
νλ‘μΈμ€ κ° ν΅μ (IPC) ꡬν νμ
Process λ°©μμμλ νλ‘μΈμ€ κ° λ°μ΄ν° 곡μ λ₯Ό μ§μ μ²λ¦¬ν΄μ£Όμ΄μΌ νλ€. μ΄λ₯Ό μν΄ Queue, Pipe, Value, Array λ±μ IPC(Inter-Process Communication) λ©μ»€λμ¦μ μ¬μ©νλ€. κ·Έλ§νΌ ꡬν λμ΄λλ μ½κ° λμ§λ§, 볡μ‘ν λ°μ΄ν° νλ¦μ μ²λ¦¬ν μ μλ€.
β
λ€μν μμ
μ²λ¦¬μ μ 리
Poolμ΄ λμΌν ν¨μλ₯Ό μ¬λ¬ λ°μ΄ν°μ μ μ©ν λ μ μ©ν λ°λ©΄, Processλ μλ‘ λ€λ₯Έ μμ
μ λ³λ ¬λ‘ μνν΄μΌ νλ κ²½μ°μ μ ν©νλ€. μλ₯Ό λ€μ΄, νλλ μλ²λ₯Ό μ€ννκ³ λ€λ₯Έ νλλ λ°μ΄ν° λ‘κΉ
μ μννλ μμ λ³λ ¬ μμ
μ²λ¦¬μ μμ£Ό μ°μΈλ€.
# μ½λ μμ - κΈ°λ³Έ
from multiprocessing import Process, Queue
def square_numbers(numbers, result_queue):
squared_numbers = [x ** 2 for x in numbers]
result_queue.put(squared_numbers)
if __name__ == "__main__":
data = [1, 2, 3, 4, 5]
result_queue = Queue()
# κ° νλ‘μΈμ€κ° λ
립μ μΌλ‘ μ€νλλ©°, μλ‘ λ€λ₯Έ μμ
μ μν
num_of_processes = 3
processes = [Process(target=square_numbers, args=(data, result_queue)) for _ in range(num_of_processes)]
for process in processes:
process.start()
for process in processes:
process.join()
# κ²°κ³Όλ₯Ό νμμ μμ§
results = [result_queue.get() for _ in processes]
print("Results:", results)
- μ΄ μμμμλ square_numbers ν¨μκ° κ°κ°μ νλ‘μΈμ€μμ μ€νλ¨
- κ° νλ‘μΈμ€λ λ 립μ μΌλ‘ data 리μ€νΈμ μ«μλ₯Ό μ κ³±νκ³ , κ·Έ κ²°κ³Όλ₯Ό result_queueμ λ£μ
- λ©μΈ νλ‘μΈμ€μμλ κ° νλ‘μΈμ€μ κ²°κ³Όλ₯Ό μμ§νμ¬ μΆλ ₯
# μ½λ μμ - κ° νλ‘μΈμ€μμ μλ‘ λ€λ₯Έ μμ μ μν
from multiprocessing import Process, Queue
def square_numbers(numbers, result_queue):
squared_numbers = [x ** 2 for x in numbers]
result_queue.put(squared_numbers)
def cube_numbers(numbers, result_queue):
cubed_numbers = [x ** 3 for x in numbers]
result_queue.put(cubed_numbers)
if __name__ == "__main__":
data = [1, 2, 3, 4, 5]
result_queue = Queue()
# κ° νλ‘μΈμ€μ λ€λ₯Έ ν¨μ ν λΉ
process1 = Process(target=square_numbers, args=(data, result_queue))
process2 = Process(target=cube_numbers, args=(data, result_queue))
# νλ‘μΈμ€ μμ
process1.start()
process2.start()
# νλ‘μΈμ€ μ’
λ£ λκΈ°
process1.join()
process2.join()
# κ²°κ³Όλ₯Ό νμμ μμ§
results = [result_queue.get(), result_queue.get()]
print("Squared Results:", results[0])
print("Cubed Results:", results[1])
- νλ‘μΈμ€λ₯Ό μ¬λ¬κ° λ§λ€κ³ κ° νλ‘μΈμ€λ§λ€ μλ‘ λ€λ₯Έ ν¨μλ₯Ό targetμΌλ‘ λ£μ΄μ£Όλ©΄ κ° νλ‘μΈμ€μμ μλ‘ λ€λ₯Έ ν¨μλ₯Ό μ€νν μ μλ€.
- μμμμλ μ«μλ₯Ό μ κ³±νλ square_numbers ν¨μμ μ«μλ₯Ό μΈμ κ³±νλ cube_numbers ν¨μλ₯Ό μλ‘ λ€λ₯Έ νλ‘μΈμ€λ‘ μ€ν