[python] λ©ν°νλ‘μΈμ± Process μ¬μ©λ² λ° μ½λ μμ | multiprocessing.Process | μ¬λ¬ νλ‘μΈμ€μ μλ‘ λ€λ₯Έ μμ μ ν λΉ
[python] λ©ν°νλ‘μΈμ± Pool μ¬μ©λ² λ° μ½λ μμ | multiprocessing.Pool | python μλ ν₯μ
λ©ν°νλ‘μΈμ±μ μ¬λ¬ κ°μ λ 립μ μΈ νλ‘μΈμ€λ₯Ό μμ±νμ¬ κ°κ°μ νλ‘μΈμ€κ° λ³λ ¬λ‘ μμ νλλ‘ νλ λ°©μμ΄λ€. κ° νλ‘μΈμ€λ λ 립μ μΈ λ©λͺ¨λ¦¬ 곡κ°μ κ°μ§λ©°, νλ‘μΈμ€ κ° ν΅μ (Inter-Process Co
mvje.tistory.com
μ ν¬μ€ν μμ νμ΄μ¬μΌλ‘ λ©ν°νλ‘μΈμ±μ μ¬μ©νκΈ° μν΄ multiprocessing.Pool μ¬μ©λ²μ λν΄ μ΄ν΄λ΄€λ€. μ΄λ²μλ multiprocessing.Processλ₯Ό νμ©ν λ©ν°νλ‘μΈμ± λ°©λ²κ³Ό Pool, Process λ κ°μ§ λ°©λ²μ μ°¨μ΄μ μ λν΄ μμλ³΄κ³ μ νλ€.
multiprocessing.Poolκ³Ό multiprocessing.Processλ νμ΄μ¬μ multiprocessing λͺ¨λμ μ¬μ©νμ¬ λ©ν°νλ‘μΈμ±μ ꡬννλ λ κ°μ§ λ€λ₯Έ λ°©λ²μΌλ‘, κ°κ°μ μ κ·Ό λ°©μμ νΉμ μν©μ λ νΈλ¦¬νκ² μ¬μ©λ μ μλ€.
νΉν μ¬λ¬ νλ‘μΈμ€μ μλ‘ λ€λ₯Έ μμ μ ν λΉνκΈ° μν΄μλ multiprocessing.Processλ₯Ό μ¬μ©νλ©΄ λλ€.
multiprocessing.Pool
- νΈλ¦¬ν μΈν°νμ΄μ€
- Pool ν΄λμ€λ₯Ό μ¬μ©νλ©΄ μ¬λ¬ νλ‘μΈμ€λ₯Ό μ½κ² μμ±νκ³ κ΄λ¦¬ν μ μμΌλ©°
- κ° νλ‘μΈμ€μ μμ μ λΆλ°°νκ³ κ²°κ³Όλ₯Ό μμ§νλ λ° μ μ©νλ€
- λλ¬Έμ κ°λ¨νκ³ λμΌν μμ μ μ¬λ¬ λ°μ΄ν°μ λ³λ ¬λ‘ μ μ©ν΄μΌ ν λ νΈλ¦¬νλ€
- μμ λΆλ°°
- map, imap, apply λ±μ ν΅ν΄ κ° νλ‘μΈμ€μ λμΌν μμ μ λ³λ ¬λ‘ λΆλ°°ν μ μλ€.
- μ λ ₯ λ°μ΄ν°λ₯Ό λλμ΄ μ²λ¦¬νκ³ κ²°κ³Όλ₯Ό μμ§νλ κ³Όμ μ΄ λ΄λΆμ μΌλ‘ μ²λ¦¬λλ€.
- ν ν¬κΈ° μ μ΄
- Poolμ processes 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ μμ±ν νλ‘μΈμ€μ κ°μλ₯Ό μ‘°μ ν μ μλ€.
# μ½λ μμ
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 ν΄λμ€λ₯Ό μ¬μ©νλ©΄ κ° νλ‘μΈμ€μ λν΄ λ λ§μ μ μ΄λ₯Ό ν μ μλ€.
- κ° νλ‘μΈμ€λ₯Ό λͺ μμ μΌλ‘ μμνκ³ μ’ λ£ν μ μλ€.
- νλ‘μΈμ€ κ° ν΅μ
- Queue, Pipe λ±μ μ¬μ©νμ¬ νλ‘μΈμ€ κ° λ°μ΄ν° κ΅νμ μ§μ ꡬνν΄μΌ νλ€.
- IPC(Inter-Process Communication) λ©μ»€λμ¦μ ν΅ν΄ λ°μ΄ν°λ₯Ό 곡μ ν μ μλ€.
- λ 볡μ‘ν μμ μ μ ν©
- 볡μ‘ν μμ μ΄λ μλ‘ λ€λ₯Έ μμ μ κ° νλ‘μΈμ€μ μννκ³ μ ν λ μ¬μ©λλ€κ³ νλ€.
# μ½λ μμ - κΈ°λ³Έ
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 ν¨μλ₯Ό μλ‘ λ€λ₯Έ νλ‘μΈμ€λ‘ μ€ν