[ํ์ด์ฌ] multiprocessing์ Pool ํด๋์ค
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/ํ์ด์ฌ-Multiprocessing-Pool
multiprocessing.Pool
์ Python์ ๋ฉํฐํ๋ก์ธ์ฑ ๋ชจ๋์์ ์ ๊ณตํ๋ ๋งค์ฐ ์ ์ฉํ ํด๋์ค๋ก, ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ํ๋ก์ธ์ค ํ์ ๊ด๋ฆฌํฉ๋๋ค. ์ด ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ๋์์ ์์
์ ์คํํ๋ ๋ณต์กํ ๋ก์ง์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ณธ ๋ธ๋ก๊ทธ ํฌ์คํธ์์๋ Pool
์ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ํน์ง์ ๋ํด ์์ธํ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
Pool ํด๋์ค์ ๊ธฐ๋ฅ
- ์๋ ํ๋ก์ธ์ค ๊ด๋ฆฌ:
Pool
์ ์ง์ ๋ ์์ ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. ํ๋ก์ธ์ค ํ์ ์์ ์ ํ ๋นํ๋ฉด,Pool
์ ์ด๋ฅผ ์๋์ผ๋ก ํ๋ก์ธ์ค์ ๋ถ๋ฐฐํ์ฌ ์คํํฉ๋๋ค. - ์์
๋ถ๋ฐฐ:
Pool
์map
๋ฉ์๋๋ ๋ด์ฅ ํจ์map()
๊ณผ ์ ์ฌํ๊ฒ ์๋ํ๋ฉฐ, ์ฌ๋ฌ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๊ฑธ์ณ ํจ์๋ฅผ ๋ณ๋ ฌ๋ก ์ ์ฉํฉ๋๋ค. ๊ฐ ํ๋ก์ธ์ค๋ ํ ๋น๋ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด ์ง์ ๋ ํจ์๋ฅผ ์คํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์์งํฉ๋๋ค. - ๊ฒฐ๊ณผ ์์ง: ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ์์ ์ ๊ฒฐ๊ณผ๋ ์๋์ผ๋ก ์์ง๋๋ฉฐ, ์์ ์ด ์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฐํํฉ๋๋ค. ์ด๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ก์ง์ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๋ฉด์๋ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ค๋๋ค.
์์ ์ฝ๋ ์ค๋ช
1
2
with Pool(processes=3) as pool:
results = pool.map(process_file, files)
Pool(processes=3)
: ํ๋ก์ธ์ค ํ์ ์์ฑํ๊ณ , ํ์๋ 3๊ฐ์ ํ๋ก์ธ์ค๊ฐ ํฌํจ๋ฉ๋๋ค. ์์คํ ์ ๋ฐ๋ผ ํ๋ก์ธ์ค ์๋ฅผ ์กฐ์ ํ์ฌ ์ต์ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.pool.map(process_file, files)
:process_file
ํจ์๋ฅผfiles
๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ ๋ณ๋ ฌ๋ก ์ ์ฉํฉ๋๋ค.process_file
ํจ์๋ ๊ฐ ํ์ผ์ ์ฒ๋ฆฌํ๊ณ , ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.map
๋ฉ์๋๋ ๋ชจ๋ ์์ ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ, ๊ฐ ์์ ์ ๋ฐํ๊ฐ์ ์์๋๋ก ๋ด์ ๋ฆฌ์คํธ๋ฅผresults
์ ํ ๋นํฉ๋๋ค.
Pool ์ฌ์ฉ์ ์ด์
- ์ฝ๋์ ๊ฐ๊ฒฐ์ฑ:
Pool
์ ์ฌ์ฉํ๋ฉด, ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ณต์กํ ํ๋ก์ธ์ค ์์ฑ, ์์, ์ข ๋ฃ ๋ก์ง์ ์ง์ ๊ด๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.Pool
์ด ์ด ๋ชจ๋ ๊ณผ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. - ์ ์ฐํ ์์
๋ถ๋ฐฐ:
map
์ธ์๋apply
,apply_async
,imap
๋ฑ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ฌ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์์ ์ ๋ถ๋ฐฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์์งํ ์ ์์ต๋๋ค. - ์์ ํ์ฉ ์ต์ ํ: ์์คํ ์ CPU ์ฝ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ์ฌ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ํ๋ก์ธ์ค ์๋ฅผ ์กฐ์ ํ์ฌ ์์คํ ์์๊ณผ ์์ ์ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ์ต์ ํํ ์ ์์ต๋๋ค.
start(), join()๊ณผ์ ์ฐจ์ด์
multiprocessing.Pool
๊ณผ ์ง์ Process
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ .start()
์ .join()
์ ํธ์ถํ๋ ๋ฐฉ์์ ๋ชจ๋ Python์์ ๋ฉํฐํ๋ก์ธ์ฑ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง, ๊ฐ๊ฐ์ ์ฌ์ฉ๋ฒ๊ณผ ์ ์ฉ ์๋๋ฆฌ์ค์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์๋์์๋ ์ด ๋ ๋ฐฉ๋ฒ์ ์ฃผ์ ์ฐจ์ด์ ์ ๋น๊ตํ๊ฒ ์ต๋๋ค.
multiprocessing.Pool
- ์๋ํ๋ ํ๋ก์ธ์ค ๊ด๋ฆฌ:
Pool
ํด๋์ค๋ ํ๋ก์ธ์ค ํ์ ์๋์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค. ํ๋ก์ธ์ค์ ์์ฑ, ์คํ, ์ข ๋ฃ ๋ฑ์ ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ดํ ํ์ ์์ดPool
์ด ์ฒ๋ฆฌํฉ๋๋ค. - ๊ฐํธํ ์์
๋ถ๋ฐฐ:
map
,apply
,imap
,starmap
๋ฑ์ ๋ฉ์๋๋ฅผ ํตํด ์ฌ๋ฌ ์์ ์ ํ๋ก์ธ์ค ํ์ ์ฝ๊ฒ ๋ถ๋ฐฐํ ์ ์์ต๋๋ค. ์ด๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ ์ฒ๋ฆฌํ ๋ ํนํ ์ ์ฉํฉ๋๋ค. - ๊ฒฐ๊ณผ ์์ง์ ์ฉ์ด์ฑ:
Pool
์ ์ฌ์ฉํ๋ฉด ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ์์งํ๊ณ ์ ๋ ฌํ ์ ์์ต๋๋ค. ์ด๋ ์์ ๊ด๋ฆฌ์ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค. - ์ ์ฉ ์๋๋ฆฌ์ค: ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, CPU ์ง์ฝ์ ์ฐ์ฐ, ๋ฐ์ดํฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฑ ๋ค์์ ๋ ๋ฆฝ์ ์ธ ์์ ์ ๋ณ๋ ฌ๋ก ์ํํด์ผ ํ ๊ฒฝ์ฐ ์ ํฉํฉ๋๋ค.
Process.start()์ Process.join()
- ์ธ๋ฐํ ํ๋ก์ธ์ค ์ ์ด:
Process
๊ฐ์ฒด์.start()
์.join()
์ ์ฌ์ฉํ๋ฉด ๊ฐ ํ๋ก์ธ์ค์ ์์๊ณผ ์ข ๋ฃ๋ฅผ ๋ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค. ๊ฐ ํ๋ก์ธ์ค์ ์์ฑ๋ถํฐ ์ข ๋ฃ๊น์ง ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ง์ ๊ด๋ฆฌํฉ๋๋ค. - ์ ์ฐํ ํ๋ก์ธ์ค ๊ด๋ฆฌ: ํน์ ํ๋ก์ธ์ค์ ๋ํ ์์ธํ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ, ์๋ฅผ ๋ค์ด ํน์ ํ๋ก์ธ์ค์ ์ฐ์ ์์๋ฅผ ์ค์ ํ๊ฑฐ๋, ํน์ ์กฐ๊ฑด์์๋ง ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ณ ์ ํ ๋ ์ ์ฉํฉ๋๋ค.
- ์๋ ๊ฒฐ๊ณผ ์์ง: ๊ฐ ํ๋ก์ธ์ค์ ๊ฒฐ๊ณผ๋ฅผ ์์งํ๋ ๋ก์ง์ ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด๋
Queue
,Pipe
, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ์ค์ ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. - ์ ์ฉ ์๋๋ฆฌ์ค: ๊ฐ๋ณ ํ๋ก์ธ์ค์ ๋ํ ๋์ ์์ค์ ์ ์ด๊ฐ ํ์ํ๊ฑฐ๋, ํ๋ก์ธ์ค ๊ฐ ๋ณต์กํ ํต์ ์ด ์๊ตฌ๋๋ ๊ฒฝ์ฐ ์ ํฉํฉ๋๋ค.
์ ๋ฆฌ
- ์๋ํ์ ์ ์ด:
Pool
์ ํ๋ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ์๋ํํ๊ณ ์์ ๋ถ๋ฐฐ์ ๊ฒฐ๊ณผ ์์ง์ ๊ฐ์ํํ๋ ๋ฐ๋ฉด,Process.start()
์.join()
์ ๊ฐ๋ณ ํ๋ก์ธ์ค์ ๋ํ ๋ ๋์ ์์ค์ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. - ์์
๋ถ๋ฐฐ:
Pool
์ ๋ค์์ ์์ ์ ์ฝ๊ฒ ๋ถ๋ฐฐํ๊ณ ์๋์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์์งํ ์ ์๋ ๋ฐ๋ฉด,Process
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๊ฐ ์์ ์ ์คํ๊ณผ ๊ฒฐ๊ณผ ์์ง์ ์๋์ผ๋ก ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. - ์ ์ฉ ์๋๋ฆฌ์ค: ๋ณต์ก๋๊ฐ ๋ฎ๊ณ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ
Pool
์ด ๋ ์ ํฉํ ์ ์์ผ๋ฉฐ, ํ๋ก์ธ์ค ๊ฐ ๋ณต์กํ ์ํธ์์ฉ์ด ํ์ํ๊ฑฐ๋ ๋์ ์์ค์ ์ ์ด๊ฐ ์๊ตฌ๋๋ ๊ฒฝ์ฐProcess
๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
๊ฐ ๋ฐฉ๋ฒ์ ์ ํ์ ๊ตฌํํด์ผ ํ๋ ์์ ์ ๋ณต์ก์ฑ, ํ์ํ ์ ์ด ์์ค, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์์งํ๊ณ ์ฒ๋ฆฌํ ์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.