Gunicorn: Windows ์ง€์› ์ถ”๊ฐ€

์— ๋งŒ๋“  2013๋…„ 05์›” 01์ผ  ยท  90์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: benoitc/gunicorn

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ PyCon์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ๋“ค๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Improvement FeaturCore help wanted - Mailing List - Platforwindows

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@jtan4nih ๊ทธ๋Ÿฐ ํƒœ๋„๋Š”

Python์€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด์ง€๋งŒ gunicorn์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  90 ๋Œ“๊ธ€

๋‹ฆ๋‹ค. R18๋กœ ์˜ˆ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ผ๋ถ€ ์—…๋ฐ์ดํŠธ:

  • SOCKET ์ง€์›์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๊ธฐ๋Š” ๋‹ค์Œ ์ฃผ์— ์˜จ๋ผ์ธ์œผ๋กœ ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํ•  ๊ฒƒ:

์„œ๋น„์Šค ์‹œ์ž‘/์ค‘์ง€/์žฌ์‹œ์ž‘์„ ์ฒ˜๋ฆฌํ•˜์—ฌ gunicorn์„ ์ „์ฒด Windows ์„œ๋น„์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ๋‹‰์Šค์—์„œ ์‹ ํ˜ธ ์‚ฌ์šฉ์„ ์–ด๋–ป๊ฒŒ ๋“  ๋Œ€์ฒดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์›์€ ๋งˆ์นจ๋‚ด R20์—์„œ ์ด๋ฃจ์–ด ์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฃผ์— ์ด ๊ธฐ๋Šฅ์˜ ๊ฐœ๋ฐœ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ PR์„ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •ํ•  ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž‘์—…์ž ์•Œ๋ฆผ์„ ์ฐฝ์— ๋งž๊ฒŒ ์กฐ์ •
  • ์‹ ํ˜ธ๋ฅผ Windows๋กœ ํฌํŒ…: reload ๋ฐ reexec
  • ์†Œ์ผ“์ด ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ์ƒ์†๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ

gunicorn์— ๋Œ€ํ•œ Windows ์ง€์› ์ถ”๊ฐ€์— ๋Œ€ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด R20 ์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์Šต๋‹ˆ๊นŒ? #587๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Š๋ฆฐ ์ง„ํ–‰. ์ด์ œ ์Šค๋ ˆ๋“œ ์ž‘์—…์œผ๋กœ R19๋ฅผ ์ถœ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์›”์š”์ผ์— ๋ฒ„์ „์„ ํ‘ธ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Windows ์ง€์›์€ ์งํ›„์— ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค.

์ด Windows ์ง€์› ๋ฒ„์ „์ด ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๊นŒ?

Windows ์ง€์›์€ R20์—์„œ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ guincorn์ด Windows๋ฅผ ์ง€์›ํ•˜๊ฒŒ ๋  ๋•Œ๊นŒ์ง€๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... Ubuntu๋กœ VM์„ ๋งŒ๋“ค์—ˆ๊ณ  ์ด๊ฒƒ์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.....

์ง„ํ–‰ ์ƒํ™ฉ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํŒจ์Šค๋กœ ๋น ๋ฅด์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ํฐ ์žฅ์ ์€ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  Windows์—์„œ Gunicorn์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  Linux ์„œ๋ฒ„(์˜ˆ: Heroku)๋กœ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@robertlagrant ์ œ ํ• ์ผ์ž…๋‹ˆ๋‹ค. ๋จผ์ € Windows ๋ผ์ด์„ ์Šค๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. R20์€ 10์›”์— ์ถœ์‹œ๋  ์˜ˆ์ •์ด๋ฉฐ,

Modern.ie์˜ VM ์ด๋ฏธ์ง€๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ๋“ค์€ ๋ฌด๋ฃŒ์ด๋ฉฐ ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๋‹ค.
2014๋…„ 9์›” 22์ผ ์˜คํ›„ 3์‹œ 30๋ถ„์— "Benoit Chesneau" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@robertlagrant https://github.com/robertlagrant
์—ฐ๋ง. ๋จผ์ € Windows ๋ผ์ด์„ ์Šค๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/benoitc/gunicorn/issues/524#issuecomment -56372470.

๋‚˜๋Š” ์ตœ๊ทผ์— IE8์—์„œ ์›น ์•ฑ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด modern.ie ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๊ธฐ ์‰ฝ๊ณ  ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

@benoitc ํ•„์š”ํ•œ ๊ฒฝ์šฐ PSF ์—์„œ Windows ๋ผ์ด์„ ์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@benoitc ์ด์— ๋Œ€ํ•œ WIP ๋ถ„๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Windows ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@berkerpeksag ์•„์ง ์•„๋‹™๋‹ˆ๋‹ค :/ ์ •๋ง ๋นจ๋ฆฌ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@cyberdelia ๋Š” PSF์—์„œ gunicorn ํ”„๋กœ์ ํŠธ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Windows ๋ผ์ด์„ ์Šค๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐ?

์ข‹์€ ์ƒ๊ฐ์ด์•ผ. https://www.python.org/psf/grants/ ์—๋Š” ๋ณด์กฐ๊ธˆ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@berkerpeksag IRC์—์„œ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ด์•ผ๊ธฐ๋ฅผ ํ•ฉ์‹œ๋‹ค. ๋Œ‘๋‹ˆ๋‹ค. :)

@benoitc ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@lealhugui ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ทธ ์ดํ›„๋กœ ์ง„์ „์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‚˜๋Š” ๊ณ„ํš์„ ์„ธ์› ๋‹ค.

  1. ์ฐฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” CI ์‹œ์Šคํ…œ ๋‚ด๋ถ€์— gunicorn์„ ๋„ฃ์–ด ์‹คํŒจ ์œ„์น˜๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ƒˆ IPC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋•Œ๋กœ๋Š” ๋‹ค์Œ ๋‹ฌ)๋ฅผ ํ†ตํ•ด ํฌํŠธ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ Windows์—์„œ ์ž‘์—… ์‹œ์ž‘

๊ฐ€๋” 3์›”์— ๋ฐœ๋งค๋ฅผ ๊ธฐ๋Œ€ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ๋” ๋นจ๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์ง€๋งŒ ์•ฝ์†์€ ์—†์Šต๋‹ˆ๋‹ค :) ์‹ค์ œ๋กœ ๋‚˜๋ณด๋‹ค ์ฐฝ์„ ๋” ์ž˜ ์•„๋Š” ์‚ฌ๋žŒ(ํžŒํŠธ 1995๋…„ ์ดํ›„๋กœ ์ฐฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค...)์ด ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ž‘์—…์ด ๋” ๋นจ๋ฆฌ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

@benoitc 1์›” ์ค‘์ˆœ ์ดํ›„์— ์ œ๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ).

@lealhugui ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ผ์ด ์ž˜ ์ง„ํ–‰๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. 3์›”์— ์ถœ์‹œ๋œ ์ด ๋ฆด๋ฆฌ์Šค๊ฐ€ ์—ฌ์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

@tannaalok ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค. @benoitc ๊ฐ€ IPC ์ž‘์—…์„ ๊ฒŒ์‹œํ•˜๊ณ  Windows ์ง€์›์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. IPC ์ž‘์—…์ด ์‹œ์ž‘๋˜๊ณ  ๋‚˜๋จธ์ง€ Windows ์ž‘์—…์ด ๊ฒ€์ƒ‰, ๋ถ„๋ฅ˜, ์ž‘์—…๋˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋งํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@tilgovi IPC ์ž‘์—…์€ ๋•Œ๋•Œ๋กœ ๋‹ค์Œ ์ฃผ์— ์ง€์ ์— ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค :)

์ด์ œ Windows ๋ฒ„์ „์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ํ•  ์ผ์€ Gunicorn์„ Windows CI์— ์—ฐ๊ฒฐ ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ cygwin์—์„œ gunicorn์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ผ๋ฐ˜ ์ฐฝ์—์„œ gunicorn์„ ์‹คํ–‰ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ gunicorn์„ ํœด๋Œ€์šฉ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์‹ ํ˜ธ ์ฒ˜๋ฆฌ : ์‹ ํ˜ธ๋Š” ์ฐฝ์—์„œ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. http://docs.gunicorn.org/en/stable/signals.html
  • ์ž‘์—…์ž ์ƒ์„ฑ : ์ฐฝ์— ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IPC ์ž‘์—…์€ ์ž„์‹œ ํŒŒ์ผ์˜ ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ž‘์—…์ž๊ฐ€ ํŒŒ์ดํ”„๋กœ ๊ต์ฒดํ•˜์—ฌ ์‚ด์•„์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ํ˜ธํ™˜์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—…์ž ์ง€์› : Windows์—์„œ gevent, eventlet ๋ฐ ํ† ๋„ค์ด๋„ ์ž‘์—…์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•„์ง ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  gunicorn ์™ธ๋ถ€์—์„œ ๋ถ„ํ• ํ•˜๋Š” ์ข‹์€ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋”ฐ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. gthread ์ž‘์—…์ž๋Š” ํŒŒ์ด์ฌ 3์œผ๋กœ ๊ฐ€๋ฉด ํˆฌ๋ช…ํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋†“์นœ ๊ฒŒ ์žˆ๋‹ˆ? ์–ด๋–ค ๋„์›€์ด๋“  ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Windows ์ผ์ผ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Windows ํ”Œ๋žซํผ์„ gunicorn์˜ ์ฒซ ๋ฒˆ์งธ ์‹œ๋ฏผ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ทธ ๋ถ€๋ถ„์„ ์ฃผ๋„ํ•˜๊ณ  ์‹ถ์€ Windows ๊ฒฝํ—˜์ด ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

Python 3.5๋Š” Windows์—์„œ ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. signal.set_wakeup_fd()๋Š” ์ด์ œ Windows์—์„œ ์†Œ์ผ“ ํ•ธ๋“ค์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
https://docs.python.org/dev/library/signal.html#signal.set_wakeup_fd

@cyberdelia ๊ฐ€ PSF์—์„œ Windows ๋ผ์ด์„ ์Šค๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ

Microsoft๋Š” Python ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฌด๋ฃŒ MSDN ๋ผ์ด์„ ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ €๋Š” ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๋กœ์„œ Visual Studio 2015์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@haypo ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์œ ๋‹‰์Šค์—์„œ๋„ ์ค‘์žฌ์ž๋ฅผ ๊นจ์šฐ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํ”„๋กœ์ ํŠธ์ผ ๋•Œ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

Windows ๊ธฐ๋Šฅ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” WSL(Linux ์šฉ Windows)๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œํ•œ๋œ Linux ๋ฐ gunicorn ์ง€์‹์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ Windows๋กœ ์ด์‹ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ์‚ฌ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Windows ์ž‘์—…์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์•„์ง ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

@DominikDitoIvosevic ์•„์ง ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฒˆ ์ฃผ์— ๋•Œ๋•Œ๋กœ ์ผ์ข…์˜ ๋กœ๋“œ๋งต์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ค๋Š˜ ์•ฝ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ ๋…์„œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” #1310์—์„œ ๋‚ด ์ž‘ํ’ˆ์„ ๋ณด๊ณ  ์žˆ์—ˆ๋‹ค. FD_CLOEXEC๋ฅผ systemd C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ PEP 446์œผ๋กœ ์ด๋Œ๊ณ  fork ํ–‰๋™์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  Windows์—๋Š” fork ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

์ผ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๋“œ๋งต์— ํ•„์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • CI ์„ค์ •
  • os.fork ๋ฅผ multiprocessing.Process ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • WorkerTemp ๋ฅผ multiprocessing.Pipe ๋ฐ”๊พธ๊ธฐ
  • FD ์ƒ์† ๋„์šฐ๋ฏธ ์˜ ํ˜ธํ™˜์„ฑ ๋ฒ„์ „ ์ถ”๊ฐ€
  • (๋‹ค๋ฅธ ๊ฒƒ, ์•„๋งˆ๋„ ๋” ์‚ฌ์†Œํ•œ ๊ฒƒ์„ ์ฐพ์•„์„œ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค)

์ง์žฅ์—์„œ Windows๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๋งค์šฐ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹ต์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ๋‚˜๋Š” ์›จ์ดํŠธ๋ฆฌ์Šค๊ฐ€
์œˆ๋„์šฐ.

2016-08-08 22:39 GMT+03:00 hirolau [email protected] :

์ง์žฅ์—์„œ Windows๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋†’์€ ๊ธฐ๋Œ€
์ด ๊ธฐ๋Šฅ!

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/benoitc/gunicorn/issues/524#issuecomment -238351654,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AALnfBAXBrmPlU1JPx6RXI0vFQPLmBlyks5qd4XhgaJpZM4AnyCw
.

์ถฉ์‹คํžˆ,
๊ธ€๋ ™

@chester89 ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฑฐ๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค....

@hirolau ์ €๋Š” ์ง€๋‚œ ๋‹ฌ์— MSDN ๊ฐœ๋ฐœ์ž ๋ผ์ด์„ ์Šค๋ฅผ ์–ป์—ˆ์œผ๋ฏ€๋กœ Windows์—์„œ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @berkerpeksag ๊ฐ€ ํ…Œ์ŠคํŠธ์— ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ณ„ํš์•ˆ์„ ์ž‘์„ฑํ•ด์„œ ๋‹ค์Œ๋‹ฌ์— ๊ฐ€๋” ์˜ฌ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)

@benoitc - ๋ป”๋ป”ํ•œ ๋ฒ”ํ”„!

๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฐฝ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ฐฝ์—์„œ gunicorn ์ž‘์—…์€ ๋งค์šฐ ๊ฐ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š” !
์–ธ์ œ ์ค€๋น„ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ํ”„๋กœ๋•์…˜์—์„œ Windows๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ด ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ ์ดˆ์•ˆ ๊ณ„ํš์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฑด๋ฐฐ!

@cmorgan ์—ฌ๊ธฐ๋„ ๊ฐ™์€ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@benoitc ์ด์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๋Ÿฌ๋ถ„, ์•ˆ๋…•ํ•˜์„ธ์š”
์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

์ „์— ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ์ง€ ๋ชปํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์š”์ฆ˜ ๋งŽ์ด ๋ฐ”๋นด์–ด์š”. ๊ทธ๋ž˜์„œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ณง ๋งŒ๋“ค ๋•Œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. II๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ณ„ํš์„ ์ผ์š”์ผ๊นŒ์ง€ ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์‹คํ˜„ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋” ์ž‘๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ž‘์—…์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ AppVeyor ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด PR #1468๊ณผ ํ•จ๊ป˜ "set up CI" ๋ถ€๋ถ„์— ๋Œ€ํ•ด #1467์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ ํ…Œ์ŠคํŠธ ์‹คํ–‰์€ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://ci.appveyor.com/project/edmorley/gunicorn/build/windows-ci.18

์ด์ „ ์˜๊ฒฌ์—์„œ ์–ธ๊ธ‰ํ•œ ๋” ํฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์‹ ํ˜ธ, ์ž‘์—…์ž IPC, ํฌํฌ ๋ถ€์กฑ ์ฒ˜๋ฆฌ ๋“ฑ) ์™ธ์—๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์ „ํ˜€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@edmorley ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค :)

์ด ๊ธฐ๋Šฅ์„ ์–ธ์ œ ์กด์ค‘ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์ด ๋ฌธ์ œ๋Š” ์•ฝ 4๋…„ ์ „์— ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.ใ€‚

์•ˆ๋…•ํ•˜์„ธ์š”,
์šฐ๋ฆฌ๋Š” ์ด ๊ธฐ๋Šฅ๋„ ๊ฐ–๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์ œ ์ด๋Ÿฐ ์ผ์ด ์‹œ์ž‘๋ ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” ์ด๊ฑฐ ์–ธ์ œ ์ฒ˜๋ฆฌ๋˜๋‚˜์š”? :)

๋ˆ„๊ตฌ๋“ ์ง€ ๋•๊ณ  ์‹ถ๋‹ค๋ฉด @edmorley ๊ฐ€ ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ PR์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ํ•ญ๋ชฉ์ด ๋” ๊ทน์ ์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” ์ด์— ๋Œ€ํ•œ ํƒ€์ž„๋ผ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด IRC๊ฐ€ ์ด์— ๋Œ€ํ•ด ์ฑ„ํŒ…ํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ณ„ ์ž‘์—… ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฐ€์žฅ ์ข‹์€ ์žฅ์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ ค๋ฉด ์ด ํ˜ธ๋ฅผ ๊ตฌ๋…ํ•˜์‹ญ์‹œ์˜ค. ์ง€๊ธˆ์€ ํƒ€์ž„๋ผ์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

FWIW, Gunicorn์€ Windows์˜ Cygwin์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑด ์•Œ์ง€๋งŒ...

@Zorlin Windows์—์„œ Cygwin๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ ์—์„œ ์˜ˆ์ œ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

$ pip install gunicorn
$ cat myapp.py
  def app(environ, start_response):
    data = b"Hello, World!\n"
    start_response("200 OK", [
        ("Content-Type", "text/plain"),
        ("Content-Length", str(len(data)))
    ])
    return iter([data])
$ gunicorn -w 4 myapp:app

Cygwin์—์„œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

<project-name>\flask\lib\site-packages\gunicorn\util.py", line 9, in <module>
    import fcntl
ModuleNotFoundError: No module named 'fcntl'

์ด๊ฒƒ์€ Windows 10์˜ ํ•˜์œ„ ์‹œ์Šคํ…œ์—์„œ๋„ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐฝ์„ ์ง€์›ํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • [ ] python3์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • [ ] os.fork ๋Œ€์‹  CreateProcessW ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(๋‹ค์ค‘ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” _winapi ์ถ”์ƒํ™”๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • [ ] ์†Œ์ผ“ asyncio์šฉ์œผ๋กœ ์ด์‹๋œ ์ผ๋ถ€ ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ์žˆ๊ณ  gthread์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” python 3์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • [ ] ๊ถŒํ•œ. ๋Œ€์‹  Windows์—์„œ ์„œ๋น„์Šค ์‹œ์ž‘์ด ๋ฐ๋ชฌํ™”๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ถŒํ•œ์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(๋‹ค์ค‘ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” _winapi ์ถ”์ƒํ™”๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

BTW, ์‚ฌ์šฉ์„ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ CreateProcess ์— popen_spawn_win32.py ํ•˜๊ณ  ๋‚ด๋ถ€ ๋ชจ๋“ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์˜ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๊ณผ์ •์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์•ˆ๋…•ํ•˜์„ธ์š”! ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์™„๋ฃŒ๋ฅผ ์œ„ํ•œ ๋ชฉํ‘œ ๋‚ ์งœ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

@bartmika ์•„๋‹ˆ. ๋Œ€์ƒ ๋‚ ์งœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Benoitc๊ฐ€ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ํ•ด์•ผ ํ•  ์ผ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋„์›€์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ์ด ํ˜ธ๋ฅผ ๊ตฌ๋…ํ•˜์‹ญ์‹œ์˜ค. ๊ณต์œ ํ•  ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@tilgovi๋‹˜ , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ข…๊ฒฐํ•˜๋Š” ๋ฐ ์ž ์žฌ์ ์œผ๋กœ ํ˜„์ƒ๊ธˆ์„ ๊ฑธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Gunicorn์˜ ๊ฐœ๋ฐœ์ž๋Š” bart [ at ] simalam.com์œผ๋กœ ์ €์—๊ฒŒ ์—ฐ๋ฝํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@bartmika ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ๋ฐ”์œ ํ•œ ์ฃผ์˜€์Šต๋‹ˆ๋‹ค. @tilgovi & @berkerpeksag ์™€ ์—ฐ๋ฝ์ด ๋‹ฟ๋Š” ๋Œ€๋กœ ๋‚ด์ผ ์—ฐ๋ฝ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค . ์–ด์จŒ๋“  ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

@benoitc ๋Š” Windows์šฉ Gunicorn์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ถœ์‹œ ๋‚ ์งœ๋Š” ์—†์ง€๋งŒ Windows์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ ํƒ€๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@jmaulsby ์ž‘์—…์€ ์•„์ง ์‹ค์ œ๋กœ ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฒœ์ฒœํžˆ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋ฅผ ์œ„ํ•œ ๊ณ„ํš์€ Windows ์ง€์›์„ ํฌํ•จํ•˜์—ฌ 12์›”์— ๋•Œ๋•Œ๋กœ ๋‹ค์Œ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@bartmika ์š”์ฆ˜ ๊ณ๊ธธ๋กœ ๋น ์ ธ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ ํ›„๋ฐ˜์— ๊ณต๊ฐœํ•  ๊ณ„ํš์„ ์„ธ์šฐ๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ Windows์— ๋Œ€ํ•œ ์ง€์›์ด ์žˆ์Šต๋‹ˆ๊นŒ? 12์›”์ด๋‹ค

๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค! 1์›”์ด๋‹ค.

@benoitc ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”,

๋ฐฉ๊ธˆ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๋ฐ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”
๋งˆ์ดํฌ

์•ˆ๋…•ํ•˜์„ธ์š”

์ง€๊ธˆ Windows์—์„œ Apache Airflow๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”
์ˆ˜๋‹ค์นด๋ฅด

์•ˆ๋…•ํ•˜์„ธ์š”,

๋‹ค์Œ ๋ช…๋ น์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

(flaskms) C:\Users\Socrates>gunicorn --bind 0.0.0.0:8000 hello-world:app
Traceback (most recent call last):
  File "c:\programdata\anaconda3\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\programdata\anaconda3\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\ProgramData\Anaconda3\Scripts\gunicorn.exe\__main__.py", line 5, in <module>
  File "c:\programdata\anaconda3\lib\site-packages\gunicorn\app\wsgiapp.py", line 10, in <module>
    from gunicorn.app.base import Application
  File "c:\programdata\anaconda3\lib\site-packages\gunicorn\app\base.py", line 12, in <module>
    from gunicorn import util
  File "c:\programdata\anaconda3\lib\site-packages\gunicorn\util.py", line 9, in <module>
    import fcntl
ModuleNotFoundError: No module named 'fcntl'

ํ•ดํ‚น, ๋‚˜๋Š” ์ฐฝ์กฐ fcntl.py , ์•„๋ž˜์˜ ๋‚ด์šฉ์œผ๋กœ ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ fcntl.cpython-36.pyc ํŒŒ์ผ ์•„๋ž˜์— ๋ฐฐ์น˜ __pycache__ ํ„ฐ๋ฏธ๋„์„ ๋‹ค์‹œ ์‹œ์ž‘, ํด๋” ๋ฐ ๋ช…๋ น ์‹คํ–‰ gunicorn --bind 0.0.0.0:8000 hello-world:app ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์šด์ด ์—†์Šต๋‹ˆ๋‹ค.

fcntl.py ์ฝ˜ํ…์ธ :

FD_CLOEXEC = 1
F_DUPFD = 0
F_GETFD = 1
F_SETFD = 2
F_GETFL = 3
F_SETFL = 4
F_GETOWN = 5
F_SETOWN = 6
F_GETLK = 7
F_SETLK = 8
F_SETLKW = 9
F_RGETLK = 10
F_RSETLK = 11
F_CNVT = 12
F_RSETLKW = 13
F_RDLCK = 1
F_WRLCK = 2
F_UNLCK = 3
F_UNLKSYS = 4

def fcntl(fd, op, arg=0):
    return 0

def ioctl(fd, op, arg=0, mutable_flag=True):
    if mutable_flag:
        return 0
    else:
        return ""

def flock(fd, op):
    return

def lockf(fd, operation, length=0, start=0, whence=0):
    return

https://stackoverflow.com/questions/11087682/does-gunicorn-run-on-windows ์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹น๋ถ„๊ฐ„ Windows์šฉ ์ตœ๊ณ ์˜ Gunicorn ๋Œ€์•ˆ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋ ๊นŒ์š”?

์—…๋ฐ์ดํŠธ: ์ €๋Š” ์ง€๊ธˆ ์›จ์ดํŠธ๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ์ข‹์€ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. :)

5๋…„์ด ์ง€๋‚ฌ๋Š”๋ฐ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”.

@hsluoyz ๊ณต๊ฐœ์ ์œผ๋กœ ์ผ์–ด๋‚œ ๋งˆ์ง€๋ง‰ ์ผ์€ ์˜ฌํ•ด 3์›” 16์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
์•„์ง Windows์—์„œ ํฌํฌ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ์šด์ด ์—†์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”,

์ด ํ‹ฐ์ผ“ ์ž‘์—…์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ญ๊ตฌ์˜ ํ˜„์žฌ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ•ญ๊ตฌ์˜ ํ˜„์žฌ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

PR #1468์€ Windows์˜ AppVeyor์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ 1๋…„ ์ „์— ๋ณ‘ํ•ฉ๋˜์—ˆ์ง€๋งŒ AppVeyor ๊ณ„์ •์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ˆ„๊ตฐ๊ฐ€๋Š” Windows ํ…Œ์ŠคํŠธ ์‹คํ–‰์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์‹คํŒจ๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@edmorley ์˜ค๋Š˜์€ ์•ฑ๋ฒ ์ด์–ด๋ฅผ ๋งก๊ฒ ์Šต๋‹ˆ๋‹ค.

@Sweepet ์•„์ง ๋งŽ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ํ•  ์ผ์€ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ๊ทธ ๊ฒฐ๊ณผ์—์„œ ํ‹ฐ์ผ“์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • [ ] ๋น„ WSL์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ? iy์— ๋ฌด์—‡์ด ๋น ์กŒ์Šต๋‹ˆ๊นŒ?
  • [ ] cygwin ์ง€์›?
  • [ ] ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์› : ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ฐ๋…์„ ์›ํ•˜๋Š”์ง€. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์„œ๋น„์Šค๋กœ ์‹คํ–‰๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์›ํ•œ๋‹ค๋ฉด ๋‚ด์ผ IRC๋ฅผ ํ†ตํ•ด ๊ฐ€๋” ๋…ผ์˜ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ €์žฅ์†Œ์— appveyor๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://ci.appveyor.com/project/benoitc/gunicorn

@benoitc , Ubuntu 18.04 ๋ฐ Python 3.6.5์— ๋Œ€ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ(examples/flaskapp.py)๊ณผ WSL์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ tox ํŒŒ์ผ์— ์ง€์ •๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. WSL์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์€ Windows 10์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ํ•œ ๋Œ€๋ถ€๋ถ„์˜ Windows ์‚ฌ์šฉ์ž ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Cygwin์ด ์—ฌ์ „ํžˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ?

๋‚ด์ผ Windows์˜ ๊ธฐ๋ณธ ์ง€์›์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์€ ๋ช‡์‹œ์ž…๋‹ˆ๊นŒ?

๋‚ด์ผ๋„ ํ•ด๋‹น ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•  ์˜ˆ์ •์ด๋ฉฐ ์ฃผ๋กœ ๊ธฐ๋ณธ Linux ๋ชจ๋“ˆ ๋ฐ ์†Œ์ผ“์„ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FWIW, Windows์—์„œ cygwin์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Python์ด Windows์—์„œ ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(์˜ˆ: psycopg2, weasyprint ๋“ฑ), ์™œ Python์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€๋Š” Windows 10์—์„œ๋„ ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jtan4nih ๊ทธ๋Ÿฐ ํƒœ๋„๋Š”

Python์€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด์ง€๋งŒ gunicorn์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋”์ฐํ•˜๊ฒŒ ์˜†์œผ๋กœ ์ถ”์ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Windows์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ gunicorn์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์–ด๋–ค ํŒจ์น˜๋„ ์ˆ˜๋ฝํ•˜๊ณ  ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

cs01/gdbgui#18์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7๋…„์ด ํ˜๋ €๋Š”๋ฐ ์šด์ด ๋”ฐ๋ผ์˜ฌ๊นŒ์š”?

๋‚˜๋Š” 3์›” ๋™์•ˆ์— ์•ฝ๊ฐ„์˜ ์ฃผ๊ธฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฐพ์•„์•ผ ํ•  ๊ฒƒ์ด๋‹ค
์–ด๋”˜๊ฐ€์—์„œ ์ฐฝ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ด๋ฏธ ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
๊ทธ๋ž˜๋„.

๋˜ํ•œ ์‹ค์ œ๋กœ ์ฐฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•ด๋‹น ์ฃผ์ œ์— ๋Œ€ํ•ด ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

waitress ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
gunicorn ์˜ ๋””์ž์ธ์€ Unix ๋ฐ Unix ๊ณ„์—ด ์ปค๋„์„ ํ™œ์šฉํ•˜์—ฌ ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

gunicorn์„ ์‚ฌ์šฉํ•˜์—ฌ heroku์— django๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ youtube ์ž์Šต์„œ๋ฅผ ๋ณด๋ฉด ์ •๋ง ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ ๋‚˜๋Š” ์—ฌ์ „ํžˆ gunicorn ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค lol

waitress ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
gunicorn ์˜ ๋””์ž์ธ์€ Unix ๋ฐ Unix ๊ณ„์—ด ์ปค๋„์„ ํ™œ์šฉํ•˜์—ฌ ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์›จ์ดํŠธ๋ฆฌ์Šค๊ฐ€ ์ ์ ˆํ•œ ๋‹ค์ค‘ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ ์ ˆํ•œ ๋‹ค์ค‘ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Windows์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋žต์ ์ธ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ์ด ๊ตฌํ˜„๋˜๋Š” ๋ฐ ์žˆ์–ด ์ง€๊ธˆ๊นŒ์ง€ ์ฃผ์š” ์žฅ์• ๋ฌผ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” 3์›” ๋™์•ˆ์— ์•ฝ๊ฐ„์˜ ์ฃผ๊ธฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์—์„œ ์œˆ๋„์šฐ๋ฅผ ์‹คํ–‰ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํ„ฐ๋ฏธ๋„์—์„œ ์ด๋ฏธ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Win10 dev VM์ด Windows๋ฅผ ์‹คํ–‰ํ•˜๊ณ  gunicorn ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์†”๋ฃจ์…˜

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” fnctl ๋Œ€์‹  pywin32 ๋ฅผ windows์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ž ๊ธˆ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰