์ฌ๋ฌ๋ถ ์๋ ํ์ธ์,
์ฌ๋ฌ ์์ฒญ์ ๋ณด๋ด๊ณ ๊ฒฐ๊ณผ๋ฅผ ์์งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ผ๋ถ ์ฒ๋ฆฌ์ ๊ฒฐํฉํ๊ณ ์ด๋๊ฐ์ ์๋ต์ ๋ฐํํ๋ API๋ฅผ ์์ ์ค์ ๋๋ค. ํ๋ก์ธ์ค๊ฐ ๋ถ๋ช ํ IO ๋ฐ์ด๋์ด๊ธฐ ๋๋ฌธ์ Greenlet ์์ ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ด๊ฐ ์ฝ์ ๋ด์ฉ์์ gunicorn ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฐ greenlet์ ์ค๋ ๋์ฒ๋ผ ์๋ํ๋ฏ๋ก IO ์ฐจ๋จ ํธ์ถ์ด IO๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ ๋ greenlet์ ํน์ gunicorn ์์ฒญ์ ์ฐจ๋จํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ด ์ฑ(ํ๋ผ์คํฌ btw ์ฌ์ฉ) ํธ๋ค๋ฌ์์ Greenlet์ด ๋ค์ requests.get()
๊น์ง ์ฐจ๋จํ requests.get(...)
๊ฐ ์ฌ๋ฌ ๊ฐ ์์ต๋๋ค.
def fetch(pid):
response0 = requests.get('http://some-micro-service-0.com/')
response1 = requests.get('http://some-micro-service-1.com/')
response2 = requests.get('http://some-micro-service-2.com/')
return combine_response(response0, response1, response2)
grequests๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๊ธฐ์ ๋ ๋ง์ ๋์์ฑ์ ์ถ๊ฐํ์ฌ ๋๊ธฐ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค(์ ๊ฐ ์ฐพ๊ณ ์๋ ๊ฒ์ ๋๋ค). ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์์ด ์์ต๋๊น?
์ฌ๋ฌ ์์ฒญ์ ์์งํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์ ์ฌํญ์ด ์์ต๋๊น?
gevent ์๋ ์ฌ๋ฌ ์์ฒญ์ ๋ณ๋ ฌ๋ก ๋ฐ์กํ๊ณ ์๋ฃ๋ ํ์๋ง ์ฒ๋ฆฌ
(๋น์ ์ ๊ฒฝ์ฐ๋ ์ฝ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ธ์ํ๋ ๋์ response
๋ฅผ ๋ฐํํ ๋ค์ ๊ฒฐํฉํฉ๋๋ค.)
๊ทธ๋ฌ๋ ์ค์ ๋ก Group.map
API๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ๋จํ๊ฒ ์งํํ ์ ์์ต๋๋ค.
from gevent import pool
jobs = pool.Group()
responses = jobs.map(requests.get,
('http://one', 'http://two', 'http://three'))
grequests๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๊ธฐ์ ๋ ๋ง์ ๋์์ฑ์ ์ถ๊ฐํ๋ ค๊ณ ํ ์ ์์ต๋๋ค.
grequests.map()
๋ ์์์ ์ ๊ณตํ ์ฝ๋ ์กฐ๊ฐ์ ์ถ์ฝํ ๋ฒ์ ์
๋๋ค.
๊ทธ ์ธ์๋ grequests
๊ฐ ๋ณ๋ก ๋์์ด ๋์ง ์์ต๋๋ค. ์ฃผ๋ก ์์
๋ ๋ ํ๋ก์ธ์ค๋ฅผ ์์ญ์ด ํจ์นํ๊ธฐ ์ํด ์กด์ฌํ์ง๋ง gunicorn์ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํฉ๋๋ค.
ํ๋์ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ํฐ์ผ์ ๋ซ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
grequests.map()
๋ ์์์ ์ ๊ณตํ ์ฝ๋ ์กฐ๊ฐ์ ์ถ์ฝํ ๋ฒ์ ์ ๋๋ค.๊ทธ ์ธ์๋
grequests
๊ฐ ๋ณ๋ก ๋์์ด ๋์ง ์์ต๋๋ค. ์ฃผ๋ก ์์ ๋ ๋ ํ๋ก์ธ์ค๋ฅผ ์์ญ์ด ํจ์นํ๊ธฐ ์ํด ์กด์ฌํ์ง๋ง gunicorn์ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํฉ๋๋ค.