Requests: ์—ด๋ ค์žˆ๋Š” ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2011๋…„ 11์›” 05์ผ  ยท  81์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: psf/requests

๊ธฐ๋ณธ๋กœ๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ๊ตฌ์ถ• ์ค‘์ด๊ณ  ํŒŒ์ผ ์„ค๋ช…์ž ์ œํ•œ์— ๋„๋‹ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์„œ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชปํ•˜๊ณ  ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ์ด ์–ด๋”˜๊ฐ€์— ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ์œ ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์ง€์› ์—†์Œ). Keepalive์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์ด ์ „ํ˜€ ์—ด๋ ค์žˆ๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ฉ๋‹ˆ๋‹ค.)

Bug Contributor Friendly

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

"์—ด๋ฆฐ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์Œ"์€ ์†Œ์ผ“์ด CLOSE_WAIT์— ๋จธ๋ฌผ๋Ÿฌ์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ulimit๋Š” ํ•ด๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

requests.async ?

์•„๋‹ˆ์š”, ๋ชจ๋“  ์š”์ฒญ์€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ผ๋ฐ˜ requests.get / requests.post์˜€์Šต๋‹ˆ๋‹ค.

$ lsof | grep localhost | wc -l
110

4/5๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

Python    82117 daleharvey  123u    IPv4 0xffffff800da304e0       0t0      TCP localhost:61488->localhost:http (CLOSE_WAIT)

์†”์งํžˆ ๋งํ•ด์„œ ์กฐ๊ธˆ ๋‹นํ™ฉ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

Hah ill ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ฐ์–ด ์•ˆ์ •์ ์œผ๋กœ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‚˜์—๊ฒŒ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ 200 ๊ฐœ ์ด์ƒ์˜ ๋™์‹œ ์—ฐ๊ฒฐ์ด์žˆ๋Š” ๋น„๋™๊ธฐ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

ulimit -n ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋†’์€ ๊ฐ’์œผ๋กœ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

"์—ด๋ฆฐ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์Œ"์€ ์†Œ์ผ“์ด CLOSE_WAIT์— ๋จธ๋ฌผ๋Ÿฌ์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ulimit๋Š” ํ•ด๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@tamiel ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ–ˆ๊ณ  httplib.HTTPSConnection์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์˜ˆ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

https://gist.github.com/1512329

HTTP ์—ฐ๊ฒฐ ๋งŒ์žˆ๋Š” ๋น„๋™๊ธฐ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์กฐ์‚ฌ ์ค‘์ด์ง€๋งŒ ํ’€ ํฌ๊ธฐ๋ฅผ async.map์— ์ „๋‹ฌํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋น ๋ฅด๊ฒŒ ์žฌํ˜„๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋กœ ์ธํ•ด gevent์—์„œ ์š”์ฒญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

CLOSE_WAIT ์— ๊ด€ํ•œ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ซ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์™œ ์—ฌ์ „ํžˆ ์—ด๋ ค ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

urllib3 ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ๋“ค์„ ์Šค์Šค๋กœ ๋‹ซ๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์—๊ฒŒ ๊ด€์ ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” httplib2์—์„œ ์š”์ฒญ์œผ๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ httplib2์—์„œ๋Š”์ด ๋ฌธ์ œ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ด€๋ จ๋œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋งค์šฐ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ •๋ง๋กœ ์š”์ฒญ + ์ˆ˜๋ฉด์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๋‹ต์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ˆ„์ˆ˜๋Š” ๋‚ด๋ถ€ ๋ฆฌ๋””๋ ‰์…˜ ์ฒ˜๋ฆฌ๋กœ ์ธํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋ณด๋ฅ˜์ค‘์ธ ์‘๋‹ต์ด ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ์ƒˆ ์š”์ฒญ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ acdha @ 730c0e2e2bef77968a86962f9d5f2bebba4d19ec ๋Š” ๊ณ„์†ํ•˜๊ธฐ ์ „์— ๊ฐ ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•จ์œผ๋กœ์จ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์ง€๋งŒ ํšจ๊ณผ์ ์ธ ์ˆ˜์ •

์ด๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ฝ๊ฐ„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  ์‹ถ๊ฒŒ ๋งŒ๋“œ๋Š” ๋‘ ๊ณณ์—์„œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ–ˆ์ง€๋งŒ ํ˜„์žฌ ๊ณ„์†ํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค.

399์—๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ ์š”์ฒญ๊ณผ ๋‚ฎ์€ fd ulimit๊ฐ€์žˆ๋Š” ๋น„๋™๊ธฐ๋กœ๋“œ ์ƒ์„ฑ๊ธฐ (https://github.com/acdha/webtoolbox/blob/master/bin/http_bench.py)์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

async๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒญํฌ ์š”์ฒญ ๋ฐ ์‘๋‹ต ์‚ญ์ œ /gc.collect ํ˜ธ์ถœ๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์˜ค๋Š˜ 5 ๊ฐœ์˜ ์—ฐ๊ฒฐ ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๋ผ์ด์„ ์Šค ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 60 ์ดˆ ๋™์•ˆ ์ผ์‹œ ์ค‘์ง€๋˜๊ธฐ ์ „์— 4 ๊ฐ€์ง€ ํ•ญ๋ชฉ ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†Œ๋น„์™€ ํ•จ๊ป˜ ์ผ๋ฐ˜ GET์„ ์‚ฌ์šฉํ•˜๋ฉด 40 ์ดˆ ์ด๋‚ด์— ์•ฝ 150 ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์—ฐ์†์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋ณธ ์ดํ›„๋กœ ์•„์ง ๋‚ด ์‹ค์ˆ˜๋ฅผํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ipython์„ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ ์š”์ฒญ์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์ง€๋งŒ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋น„์Šทํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.
Traceback (most recent call last):
    File "/Library/Python/2.7/site-packages/IPython/core/ultratb.py", line 756, in structured_traceback
    File "/Library/Python/2.7/site-packages/IPython/core/ultratb.py", line 242, in _fixed_getinnerframes
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 1035, in getinnerframes
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 995, in getframeinfo
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 456, in getsourcefile
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 485, in getmodule
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 469, in getabsfile
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 347, in abspath
OSError: [Errno 24] Too many open files

Unfortunately, your original traceback can not be constructed.

์ด์ƒํ•˜๊ฒŒ๋„ ์ผ๋ฐ˜ Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋งŒ ์‚ฌ์šฉํ•  ๋•Œ "Max Retries Error"๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋™์ผํ•œ ๋„๋ฉ”์ธ์—์„œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” allow_redirects๊ฐ€ True ์ธ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๊ฒƒ์„ ๋งŒ๋‚ฌ๋‹ค. ์ด๋Š” prefetch = True๋กœ๋„ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์ฒด์ธ ๋ˆ„์ˆ˜ ์‘๋‹ต ๊ฐ์ฒด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ์ดˆ๊ธฐ ํ…Œ์ŠคํŠธ์—์„œ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

        [i.raw.release_conn() for i in resp.history]
        resp.raw.release_conn()

ํ  ..

@acdha ์„ค์ • :

requests.defaults.defaults['allow_redirects'] = False

์š”์ฒญํ•˜๊ธฐ ์ „์— ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ์š”์ฒญ์—๋Š” ๋ฆฌ๋””๋ ‰์…˜์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋‚ด ๊ตฌํ˜„์— ๋Œ€ํ•œ ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค = /

@dalanmiller ์‘๋‹ต์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด์ „์— ์‘๋‹ต ํ›„ํฌ์™€ ํ•จ๊ป˜ async.map ์„ ์‚ฌ์šฉํ–ˆ๊ณ  async.imap ์ด์ƒ์˜ ๊ฐ„๋‹จํ•œ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์•ˆ์ •์ ์ด๋˜๋Š” ๊ฒƒ์œผ๋กœ _appears_ :

for resp in requests.async.imap(reqs, size=8):
    try:
        print resp.status_code, resp.url
    finally:
        [i.raw.release_conn() for i in resp.history]
        resp.raw.release_conn()

@acdha

๋‚˜๋Š” URL ๋ชฉ๋ก์„ ํ†ตํ•ด for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚ด ์„ค์ • ๋“ฑ์œผ๋กœ ๊ฐ๊ฐ์— request.get์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

for u in urls:
    response_list.append(requests.get(u))

๋ถ™์—ฌ ๋„ฃ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” "์ตœ๋Œ€ ์žฌ์‹œ๋„ ์˜ค๋ฅ˜๊ฐ€ url์„ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ ๋  ๋•Œ๊นŒ์ง€ 900 ๊ฐœ ๊ธธ์ด ๋ชฉ๋ก์—์žˆ๋Š” ์•ฝ 50 ๊ฐœ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋™์ผํ•œ ๋„๋ฉ”์ธ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ํ‘œ์ค€์ ์ธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

์ด๋ด, ๋‚˜๋Š” 35k์˜ ๊ฑฐ๋Œ€ํ•œ URL ๋ชฉ๋ก์„ ํฌ๋กค๋งํ•˜๊ณ  ์žˆ์—ˆ๊ณ  _some_์˜ ์š”์ฒญ์—์„œ ์ด์™€ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด 10 ๊ฐœ ๋‹จ์œ„๋กœ URL์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

responses = requests.async.map([requests.async.get(u, params=self.params()) for u in chunk]) # chunk is a list of 10

20k ๋ฒ”์œ„ ์–ด๋”˜๊ฐ€์— ์˜ค๋ฅ˜ 24๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ 30k๋ฅผ ํ†ตํ•ด ์ •์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ”์œ„๋ฅผ ์ขํžˆ๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ?

requests.async ์ด (๊ฐ€) ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. grequests๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ๊ณ ๋งˆ์›Œ. ๋ฌธ์„œ์—์„œ ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Pull Requests์™€ ๋ฌธ์„œ ์ž‘์„ฑ์— ๊ด€ํ•ด์„œ๋Š” ์ผ์ข…์˜ ๋ฉ์ฒญํ•œ ์ผ์ด์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ฐ”๋Ÿฌ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์˜๊ฒฌ์ด๋‚˜ ๋น„ํŒ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค :)

https://github.com/kennethreitz/requests/pull/665

์ข‹์•„, ์ด๊ฒƒ์€ 6K ์š”์ฒญ ํ›„ requests.get๋งŒ์œผ๋กœ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์˜์‹ฌํ–ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ •ํ™•ํžˆ 1k ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•œ ํ›„ '๋„ˆ๋ฌด ๋งŽ์€ ํŒŒ์ผ ์—ด๊ธฐ'์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ•ด๊ฒฐ์ฑ…์€ Keep-alive ์†์„ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ฒญํฌ ๋‹จ์œ„๋กœ ์š”์ฒญ์„๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ( @acdha ํžŒํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค). lsof -p PID | wc -l ๋Š” ์‹คํ–‰ ์ค‘ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

rsess = requests.session()
rsess.config['keep-alive'] = False

rs = [grequests.get(l, session=rsess) for l in links]

for s in chunks(rs,100):
    responses = grequests.map(s, size=concurrency)
    for r in responses:
        try:
            print(r.status_code, r.url)
        finally:
            r.raw.release_conn()

[1] ์ฒญํ‚น : http://stackoverflow.com/a/312464

urllib3 ์ˆ˜์ •์„ ์—ฐ๊ธฐํ•˜๋Š” ๋™์•ˆ ๋‹ซ๊ธฐ.

@kennethreitz urllib3์˜ ๋ฐœํ–‰ ๋ฒˆํ˜ธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค http://bugs.python.org/issue16298

@silvexis ๋Š” urllib3 ๋ฒ„๊ทธ์™€ ๋งค์šฐ ๊ด€๋ จ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ˆ„๊ตฐ๊ฐ€ @ piotr-dobrogost์— ๋Œ€๋‹ตํ–ˆ์œผ๋ฉดํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ๋ณด๊ณ ๋ฅผ๋“ค์€ ์ ์ด ์—†๋‹ค. ๋‹น์‹ ์€?

ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ์•„๋‹Œ ๋ฐ•์Šค ๊ตฌ์„ฑ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. OS์˜ ์ปค๋„ ๊ตฌ์„ฑ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. BSD์—์„œ๋Š” kern.maxfiles ํ•ฉ๋‹ˆ๋‹ค. Linux ์‹œ์Šคํ…œ์—๋Š” ulimit ์— ๋Œ€ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in-linux
๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ Windows์—์„œ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ด์ „ ๋ฒ„์ „์˜ ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋”์ฐํ•œ ์ฝ”๋“œ๋ฅผ ๋งˆ๋ จํ–ˆ์Šต๋‹ˆ๋‹ค.

    if self._current_response is not None:
            # Requests doesn't have a clean API to actually close the
            # socket properly. Dig through multiple levels of private APIs
            # to close the socket ourselves. Icky.
            self._current_response.raw.release_conn()
            if self._current_response.raw._fp.fp is not None:
                sock = self._current_response.raw._fp.fp._sock
                try:
                    logger.debug('Forcibly closing socket')
                    sock.shutdown(socket.SHUT_RDWR)
                    sock.close()
                except socket.error:
                    pass

(๋‚˜๋Š” self._current_response๊ฐ€ ์š”์ฒญ์˜ ์‘๋‹ต ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)

ํ , ๋‹ซ๋Š” ์‚ฌ์Šฌ์€ ์–ด๋””์—์„œ ๋Š์–ด ์กŒ๋‚˜์š”? release_conn() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Response.close() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด release_conn() ์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@Lukasa ์ด๊ฒƒ์€ ํ† ๋ก ์˜ ์ผ๋ถ€ ์˜€๊ธฐ ๋•Œ๋ฌธ์— urllib3์—์„œ ํ™•์‹คํžˆ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ถ”์ •์น˜์—์„œ ๋ณด์ˆ˜์  ์ธ ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ 1.1.x๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด 1.2.x๋ฅผ ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๊ธฐ์— ์žˆ๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

2.0.2์—์„œ CLOSE_WAIT ๋ˆ„์ถœ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•œ ํšŒ๊ท€๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ, ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AFAIK urllib3๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ˆ„์ถœ์„ ์‰ฝ๊ฒŒ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์›”์š”์ผ๋ถ€ํ„ฐ ๋‚ด๋ถ€ ์•ฑ์—์„œ ์š”์ฒญ์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ์˜ค๋Š˜์€ 1024 ๊ฐœ์˜ maxfiles์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์žฌ๋ถ€ํŒ… ํ›„ 2 ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด lsof์—์„œ ๋งํ•œ๋Œ€๋กœ 40 ๊ฐœ์˜ CLOSE_WAIT๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์† ์—ฐ๋ฝ ํ• ๊ฒŒ

@tardyp ๋„ ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์„ค์น˜ ํ–ˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  OS ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ urllib3์„ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pip๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ด ๋ฌธ์ œ์— ํ† ๋ก ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด ์ถ”์  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pip๋กœ ์„ค์น˜ํ–ˆ์ง€๋งŒ python 2.6์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ฒ„๊ทธ. ์ด์ „ ๋ฒ„์ „์„์œ„ํ•œ monkeypatch์ž…๋‹ˆ๊นŒ?

ํ”ผ์—๋ฅด

2013 ๋…„ 11 ์›” 29 ์ผ ๊ธˆ์š”์ผ ์˜คํ›„ 5์‹œ 33 ๋ถ„ Ian Cordasco [email protected]

@tardyp https://github.com/tardyp ๋„ ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์„ค์น˜ ํ–ˆ๋‚˜์š”? ๋‚˜๋Š”
๋ชจ๋“  OS ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ urllib3์„ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด
์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ  ์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€์‹  ์›์ธ. pip๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์–ธ์ œ๋“ ์ง€ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด์–ด
์ด๊ฒƒ์— ํ† ๋ก ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹ ์— ์ด๊ฒƒ์„ ์ถ”์ ํ•˜์‹ญ์‹œ์˜ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ํšŒ์‹ ํ•˜๊ฑฐ๋‚˜ Gi tHub์—์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
.

@tardyp ์š”์ฒญ์— ๋ฆฌ๋””๋ ‰์…˜์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ gevent๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์œผ๋กœ ์ƒˆ ๋ฌธ์ œ๋ฅผ์—ฌ์‹ญ์‹œ์˜ค. ๋˜ํ•œ ์šด์˜ ์ฒด์ œ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด์™€์ด๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ๋„ ํ™˜์ƒ์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ https://github.com/shazow/urllib3/issues/291 ์€ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ๋˜๋Œ ๋ ธ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ์—ด์–ด ๋ณผ๊นŒ์š”?
๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

@polvoazul ์ด๊ฒƒ์ด 2011 ๋…„์— ์ฒ˜์Œ๋ณด๊ณ  ๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ ์ผ

@Lukasa ๋‚˜๋Š” ๋‹น์‹ ์ด ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹คใ€‚ ๋‚˜๋Š” ํ•ญ์ƒ ํ”„๋กœํ† ์ฝœ์„ ์‹๋ณ„ ํ•  ์ˆ˜์—†๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์–‘๋ง์„ ๋งŒ๋“œ๋Š” eventlet + ์š”์ฒญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์š”์ฒญ์€ 2.4.3์ž…๋‹ˆ๋‹ค. eventlet + ์š”์ฒญ ์ด์ด ๋ฌธ์ œ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๊นŒ?

@mygoda ๋ฏธ์•ˆํ•˜์ง€๋งŒ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ์š”์ฒญ์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๋Š” ์š”์ฒญ์„ ์ œ์™ธํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@Lukasa ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๊ฐ€ ์ด๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค . ๋‚ด ํ”„๋กœ์ ํŠธ๋Š” pyvmomi ์ž…๋‹ˆ๋‹ค. ๊ทธ ์—ฐ๊ฒฐ์€ ๊ธด ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค. ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ”„๋กœํ† ์ฝœ ์–‘๋ง์„ ์‹๋ณ„ ํ•  ์ˆ˜ ์—†๋Š”์ง€ ํ•ญ์ƒ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ 120 ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 10 ๋งŒ ๊ฐœ ์ด์ƒ์˜ ์—ด๋ฆฐ ํŒŒ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@mygoda ๋‹น์‹ ์€ ๋ฉ‹์ง„ ๊ธฐ๊ฐ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@ 1a1a11a _What_ ํŒŒ์ผ์ด ์—ด๋ ค ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

@ 1a1a11a ์–ด๋–ค ๋ฒ„์ „์˜ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ๋ฒ„์ „์˜ ํŒŒ์ด์ฌ? ์–ด๋–ค ์šด์˜ ์ฒด์ œ? ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์š”์ฒญ 2.9.1, python 3.4, ์šฐ๋ถ„ํˆฌ 14.04๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ 30 ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ”„๋ก์‹œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ์›น ์‚ฌ์ดํŠธ๋ฅผ ํฌ๋กค๋งํ•˜๋Š” ํฌ๋กค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค ๋‹น ํŒŒ์ผ ์ œํ•œ์„ 655350์œผ๋กœ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.

requests.packages.urllib3.connection.VerifiedHTTPSConnection์—์„œ "Failed to set a new connection : [Errno 24] Too many open files"๋ผ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ณ„์† ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. Python 3.4, ์š”์ฒญ 2.11.1 ๋ฐ requests-futures๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 0.9.7. requests-futures๋Š” ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š” ์ ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ ์š”์ฒญ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. SSL์„ ํ†ตํ•ด 180k ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ 1000 ๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์˜ ๋ชจ๋“  ๊ฐœ์ฒด๊ฐ€ ํ•ด๊ฒฐ ๋œ ํ›„์— ๋งŒ โ€‹โ€‹๋‹ค์Œ 1000 ๊ฐœ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. Ubuntu 16.04.2๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ณ  ๊ธฐ๋ณธ ์—ด๋ฆฐ ํŒŒ์ผ ์ œํ•œ์€ 1024์ž…๋‹ˆ๋‹ค.์ด ์˜ค๋ฅ˜์˜ ๊ทผ๋ณธ์ ์ธ ์›์ธ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•ฉ๋‹ˆ๊นŒ? ๊ฐ ๊ฐœ๋ณ„ ์š”์ฒญ์— ๋Œ€ํ•ด ์—ด๋ฆฐ ํŒŒ์ผ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? SSL ์ธ์ฆ์„œ ํŒŒ์ผ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ–ฅํ›„ ๊ฐœ์ฒด๊ฐ€ ํ•ด๊ฒฐ ๋  ๋•Œ ์—ด๋ฆฐ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ๋‹ซ์Šต๋‹ˆ๊นŒ?

์š”์ฒญ์€ ๋งŽ์€ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ ์ค‘ ์ผ๋ถ€๋Š” ์ธ์ฆ์„œ ์šฉ์œผ๋กœ ์—ด๋ฆฌ์ง€ ๋งŒ ์š”์ฒญ์ด ์•„๋‹Œ OpenSSL์— ์˜ํ•ด ์—ด๋ฆฌ๋ฏ€๋กœ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์š”์ฒญ์€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ .netrc ํŒŒ์ผ, ํ˜ธ์ŠคํŠธ ํŒŒ์ผ ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋„ ์—ฝ๋‹ˆ ๋‹ค.

strace ์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ํŒŒ์ผ์ด ์—ด๋ ค ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ํ• ๋‹น๋˜๋„๋กํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์—„๊ฒฉํ•œ ๋ชฉ๋ก์ด ์žˆ์œผ๋ฏ€๋กœ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์‹ ์†ํ•˜๊ฒŒ ์—ด๊ฑฐ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ, HTTPS๋ฅผ ํ†ตํ•ด 1000 ๊ฐœ์˜ ์—ฐ๊ฒฐ์„ ์ ๊ทน์ ์œผ๋กœ ์ˆ˜ํ–‰ ํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ๋Œ€๋กœ๋“œ์‹œ 1000 ๊ฐœ ์ด์ƒ์˜ FD๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ๋ฌธ์ œ๋กœ๋„ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๊ณ  OS X์—์„œ opensnoop ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ™์€ ๋ฌธ์ œ์— ๋ถ€๋”ชํžˆ๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ HTTP (HTTPS ์•„๋‹˜) ์„œ๋ฒ„์— requests.post(url, data=data) ์„ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœ ํ•  ๋•Œ์ด ์˜ค๋ฅ˜๊ฐ€ ์ž์ฃผ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Ubuntu 16.04.3, Python 3.5.2์—์„œ ์‹คํ–‰, 2.9.1 ์š”์ฒญ

data ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ˆ˜๋ฐฑ kb ํ…์ŠคํŠธ

ํŒŒ์ผ ๊ฐ์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ๋ฉ”๋ชจ๋ฆฌ์— ํฐ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ๋‹จ์ผ ์Šค๋ ˆ๋“œ, localhost์— ๊ฒŒ์‹œ

๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ FD๋ฅผ ์œ ์ถœํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ TCP ์—ฐ๊ฒฐ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ ํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉ์ ์œผ๋กœ ๋‹ซ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์œผ์‹ญ๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Python 2.7, ์š”์ฒญ 2.18.4, urllib3 1.22.
๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ ์‹คํ–‰ (๋‹ค์ค‘ ์ฒ˜๋ฆฌ ์•„๋‹˜). ํ•œ ๋ฒˆ์— ์ตœ๋Œ€ 6 ๊ฐœ์˜ URL์— ์—ฐ๊ฒฐํ•˜๊ณ  ๊ฐ URL์— ๋Œ€ํ•ด ์ˆ˜๋™์œผ๋กœ ์ƒˆ ์„ธ์…˜์„ ๋งŒ๋“ค๊ณ  ๋‹ซ์Šต๋‹ˆ๋‹ค.

Python 3.5 , requests==2.18.4 ์—์„œ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@mcobzarenco ์‘๋‹ต์˜ ๊ธฐ๋ณธ ์—ฐ๊ฒฐ์„ (์•”์‹œ ์ ์œผ๋กœ) ๋‹ซ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ ํ•ด์„œ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. response.content๋ฅผ ์ฝ์„ ๋•Œ ๋ฐ์ดํ„ฐ๋Š” ์‹ค์ œ๋กœ ์ฝํžˆ๊ณ  ๊ทธ ํ›„์— ์†Œ์ผ“์€ CLOSE_WAIT์— ๋จธ๋ฌผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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