[νμ΄μ¬] Multiprocessing, Multithreading μ¬μ© μ κ³ λ € μ¬ν
μλ³Έ κ²μκΈ: https://velog.io/@euisuk-chung/νμ΄μ¬-Multiprocessing-Multithreading-μ¬μ©-μ-κ³ λ €-μ¬ν-μμ-μ½λ-ν¬ν¨
λ©ν°νλ‘μΈμ±
κ³Ό λ©ν°μ€λ λ©
μ μ νν λ κ³ λ €ν΄μΌ νλ μμ
μ νΉμ±μ λν΄ λ μμΈν μ€λͺ
νκ² μ΅λλ€. μμ λΆν λ° ν λΉ
μ λν΄μ κΆκΈνμ λΆμ λ€μ κ²μκΈμμ νμΈνμ€ μ μμ΅λλ€.
λ©ν°νλ‘μΈμ±(Multiprocessing)
λ©ν°νλ‘μΈμ±μ μ£Όλ‘ CPU μ§μ½μ μΈ μμ μ μ ν©ν©λλ€. μ΄λ° μμ μ κ³μ°μ΄ λ§μ΄ νμνκ³ CPUμ μμμ λ§μ΄ μ¬μ©νλ κ²½μ°μΈλ°μ. μλ‘, λ°μ΄ν° λΆμ, μ΄λ―Έμ§ μ²λ¦¬, 볡μ‘ν μνμ κ³μ° λ±μ΄ μ¬κΈ°μ ν΄λΉν©λλ€.
λ©ν°νλ‘μΈμ±μ μ¬μ©νλ©΄ κ° νλ‘μΈμ€κ° λ 립λ λ©λͺ¨λ¦¬ 곡κ°μ κ°μ§κΈ° λλ¬Έμ, ν νλ‘μΈμ€μμ λ°μν λ¬Έμ (μ: λ©λͺ¨λ¦¬ λμ)κ° λ€λ₯Έ νλ‘μΈμ€μ μν₯μ λ―ΈμΉμ§ μμ΅λλ€. λν, λ©ν°μ½μ΄ CPUλ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©νμ¬ μμ μ λ³λ ¬λ‘ μ²λ¦¬ν μ μμ΅λλ€.
λ©ν°νλ‘μΈμ± μμ μ½λ μ€λͺ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from multiprocessing import Pool
import pandas as pd
def process_file(file_name):
# λμ©λ νμΌ μ²λ¦¬ λ‘μ§
data = pd.read_csv(file_name)
# 볡μ‘ν λ°μ΄ν° μ²λ¦¬ μμ
μν
processed_data = data # μ΄ λΆλΆμ μμλ‘ λ체
return processed_data
if __name__ == '__main__':
files = ['file1.csv', 'file2.csv', 'file3.csv'] # μ²λ¦¬ν νμΌ λͺ©λ‘
with Pool(processes=3) as pool:
results = pool.map(process_file, files)
Pool
κ°μ²΄λ₯Ό μ¬μ©νμ¬ λ©ν°νλ‘μΈμ± νμ μμ±ν©λλ€. μ΄ νμ μ¬λ¬ νλ‘μΈμ€λ₯Ό κ΄λ¦¬νλ©°, κ° νλ‘μΈμ€μ μμ μ ν λΉν©λλ€.process_file
ν¨μλ κ° νμΌμ μ²λ¦¬νλ λ‘μ§μ λ΄κ³ μμ΅λλ€. μ¬κΈ°μλ μμλ‘ pandasλ₯Ό μ¬μ©νμ¬ CSV νμΌμ μ½μ΄λ€μ΄λ κ²μΌλ‘ λνλμ΅λλ€.pool.map
λ©μλλ₯Ό ν΅ν΄ νμΌ λͺ©λ‘μ λν΄process_file
ν¨μλ₯Ό λ³λ ¬λ‘ μ€νν©λλ€. κ° νλ‘μΈμ€λ νμΌ λͺ©λ‘ μ€ νλλ₯Ό λ°μ λ 립μ μΌλ‘ μ²λ¦¬ν©λλ€.
μμμ μ¬μ©ν pool.map
λμ start
μ join
μ μ¬μ©νκ³ λ λμΌνκ² λ©ν°νλ‘μΈμ±μ μνν μ μμ΅λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from multiprocessing import Process
import pandas as pd
def process_file(file_name):
# λμ©λ νμΌ μ²λ¦¬ λ‘μ§
print(f"Processing {file_name}")
data = pd.read_csv(file_name)
# 볡μ‘ν λ°μ΄ν° μ²λ¦¬ μμ
μν
processed_data = data # μ΄ λΆλΆμ μμλ‘ λ체
# μ²λ¦¬λ λ°μ΄ν° λ°ν λμ νμΌ μ΄λ¦κ³Ό μ²λ¦¬ μλ£ μΆλ ₯
print(f"Finished processing {file_name}")
return processed_data
if __name__ == '__main__':
files = ['file1.csv', 'file2.csv', 'file3.csv'] # μ²λ¦¬ν νμΌ λͺ©λ‘
processes = []
# κ° νμΌμ λν΄ λ³λμ νλ‘μΈμ€ μμ± λ° μμ
for file_name in files:
process = Process(target=process_file, args=(file_name,))
processes.append(process)
process.start()
# λͺ¨λ νλ‘μΈμ€μ μλ£λ₯Ό κΈ°λ€λ¦Ό
for process in processes:
process.join()
print("All processing complete.")
.start()
λ©μλλ₯Ό νΈμΆνμ¬ κ° νλ‘μΈμ€λ₯Ό μμν©λλ€. μ΄λ κ° νμΌ μ²λ¦¬ μμ μ λ³λ ¬λ‘ μ€ννκ² λ§λλλ€..join()
λ©μλλ₯Ό μ¬μ©νμ¬ λ©μΈ νλ‘μΈμ€κ° λͺ¨λ μμ νλ‘μΈμ€μ μ€νμ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬κ² ν©λλ€. μ΄λ λͺ¨λ λ°μ΄ν° μ²λ¦¬ μμ μ΄ μλ£λ λκΉμ§ νλ‘κ·Έλ¨μ μ’ λ£λ₯Ό μ§μ°μν΅λλ€.
λ©ν°μ€λ λ©(Multithreading)
λ©ν°μ€λ λ©μ μ£Όλ‘ I/O λ°μ΄λ μμ μ μ ν©ν©λλ€. μ΄λ° μμ μ λλμ μ μΆλ ₯, μλ₯Ό λ€μ΄, νμΌ μ½κΈ°/μ°κΈ°, λ€νΈμν¬ ν΅μ λ±μ νμλ‘ νλ κ²½μ°μ λλ€. μ΄ κ²½μ°, νλ‘κ·Έλ¨μ λλΆλΆμ μκ°μ λ°μ΄ν°λ₯Ό μ½κ±°λ μ°κΈ°λ₯Ό κΈ°λ€λ¦¬λ©° 보λ΄κ² λλλ°, μ΄λ CPUλ λ§μ μκ° λμ μ무 μΌλ νμ§ μκ² λ©λλ€.
λ©ν°μ€λ λ©μ μ¬μ©νλ©΄, ν μ€λ λκ° I/O μμ μΌλ‘ λκΈ° μνμΌ λ λ€λ₯Έ μ€λ λκ° CPUλ₯Ό μ¬μ©νμ¬ μμ μ κ³μ μ§νν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ μ 체 μ€ν μκ°μ μ€μΌ μ μμ΅λλ€.
λ©ν°μ€λ λ© μμ μ½λ μ€λͺ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import threading
import requests
def fetch_data(url):
# μΉμ¬μ΄νΈμμ λ°μ΄ν°λ₯Ό μμ²νκ³ μ²λ¦¬νλ λ‘μ§
response = requests.get(url)
data = response.text # μ΄ λΆλΆμ μμλ‘ λ체
return data
urls = ['http://example.com/data1', 'http://example.com/data2', 'http://example.com/data3'] # λ°μ΄ν°λ₯Ό μμ§ν μΉμ¬μ΄νΈ μ£Όμ λͺ©λ‘
threads = []
for url in urls:
thread = threading.Thread(target=fetch_data, args=(url,))
threads.append(thread)
thread.start()
for thread in
threads:
thread.join()
- μ¬κΈ°μλ
threading.Thread
λ₯Ό μ¬μ©νμ¬ κ° URLμ λν λ°μ΄ν° μμ§ μμ μ λ³λμ μ€λ λλ‘ μ€νν©λλ€. fetch_data
ν¨μλ μ£Όμ΄μ§ URLμμ λ°μ΄ν°λ₯Ό μμ²νκ³ , μλ΅μ λ°μμ€λ μν μ ν©λλ€.- κ° μ€λ λλ λ 립μ μΌλ‘ μΉμ¬μ΄νΈμ μμ²μ 보λ΄κ³ μλ΅μ κΈ°λ€λ¦½λλ€. μ΄ κ³Όμ μμ I/O μμ μ΄ μ§νλλ λμ, λ€λ₯Έ μ€λ λλ CPUλ₯Ό νμ©ν μ μμ΅λλ€.
thread.join()
μ λ©μΈ μ€λ λκ° λͺ¨λ μ€λ λμ μμ μ΄ λλ λκΉμ§ κΈ°λ€λ¦¬λλ‘ ν©λλ€.
λ©ν°νλ‘μΈμ±κ³Ό λ©ν°μ€λ λ©μ μ νμ μμ μ νΉμ±μ λ°λΌ λ¬λΌμ§λλ€. CPU μ¬μ©μ΄ λ§μ μμ μλ λ©ν°νλ‘μΈμ±μ, I/O μμ μ΄ λ§μ κ²½μ°μλ λ©ν°μ€λ λ©μ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.