[ํŒŒ์ด์ฌ] multiprocessing์˜ Pool ํด๋ž˜์Šค

Posted by Euisuk's Dev Log on February 19, 2024

[ํŒŒ์ด์ฌ] 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๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ฐฉ๋ฒ•์˜ ์„ ํƒ์€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์˜ ๋ณต์žก์„ฑ, ํ•„์š”ํ•œ ์ œ์–ด ์ˆ˜์ค€, ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ง‘ํ•˜๊ณ  ์ฒ˜๋ฆฌํ• ์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



-->