https://github.com/alex/http-client-benchã«ã¯ãç§ã䜿çšãããã³ãããŒã¯ãå«ãŸããŠããŸãã
çµæã¯æ¬¡ã®ããã«ãªããŸãã
| | ãªã¯ãšã¹ã/ http | ãœã±ãã|
| --- | --- | --- |
| CPython | 12MB /ç§| 200MB /ç§|
| PyPy | 80MB /ç§| 300MB /ç§|
| è¡ã| 150MB /ç§| 該åœãªã|
ãªã¯ãšã¹ãã¯ãç¹ã«CPythonã§ããœã±ãããšæ¯èŒããŠããªãã®ãªãŒããŒãããã課ããŸãã
ãã®ãªãŒããŒãããã¯äºæ³å€ã«å€§ããã§ãã ãã ãããããåé¿ããã®ã¯é£ãããããããŸããã
倧ããªåé¡ã¯ããã£ã³ã¯ããšã«ããªãå€ãã®åŠçãè¡ãããšã§ãã ããã¯ã¹ã¿ãã¯ã®ãã£ãšäžã«ãããŸãïŒãªã¯ãšã¹ããurllib3ãšhttplibã 誰ãéå¹çãåŒââãèµ·ãããŠããã®ãã解æããããã«ã©ãã§æéãè²»ããããŠããããç¥ãããšã¯éåžžã«èå³æ·±ãã§ãããã
次ã®ã¹ãããã¯ãhttplib / urllib3ã®ãããã¡ã€ãªã³ã°ãè©ŠããŠ
ããã®ããã©ãŒãã³ã¹ïŒ
ã±ãã³ã»ããŒã¯
é»è©±çªå·ïŒ925.271.7005 | 20milliseconds.com
5æ01åPMã«æšã2014幎12æ4æ¥ã«ã¯ãã³ãŒãªãŒãã³ãã£ãŒã«ã[email protected]
æžããŸããïŒ
ãã®ãªãŒããŒãããã¯äºæ³å€ã«å€§ããã§ãã ãã ãããããåé¿ããã®ã¯é£ãããããããŸããã
倧ããªåé¡ã¯ããã£ã³ã¯ããšã«ããªãå€ãã®åŠçãè¡ãããšã§ãã ããã¯
ã¹ã¿ãã¯ã®æåŸãŸã§ïŒãªã¯ãšã¹ããurllib3ãhttplibã ããã¯ãã®ããã«ãªããŸã
誰ã誰ã§ãããã解æããããã«ã©ãã§æéãè²»ããããŠããããèŠãã®ã¯éåžžã«èå³æ·±ã
éå¹çãåŒââãèµ·ãããŠããŸããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65732050
ã
urllib3ã§ãã³ãããŒã¯ãå®è¡ããã ãã§ãã
PyPyïŒ120MB /ç§
CPythonïŒ70MB /ç§
ãããŠãCPython +ãªã¯ãšã¹ããåå®è¡ããŸããïŒ35MB /ç§
ïŒç§ã®ãã·ã³ã¯ãã³ãããŒã¯ã§ããªãã®ãã€ãºãçµéšããŠããããã§ãã誰ãããããã䜿çšã§ããããéããªã·ã¹ãã ãæã£ãŠãããªããããã¯çŽ æŽãããã§ãããïŒ
ä»ã®ãã¹ãŠãã·ã£ããããŠã³ããåŸãèªåã®ãã·ã³ã§ããããå®è¡ããŠã¿ãŸãã
ã¢ããªã±ãŒã·ã§ã³ãšã¿ãŒããã«ãŠã£ã³ããŠããããŠããªãã®éã®ãã€ãºããããŸãã-
ãœã±ãããã³ãããŒã¯ã¯30mb / sãã460mb / sã®ç¯å²ã§ããã
ã±ãã³ã»ããŒã¯
é»è©±çªå·ïŒ925.271.7005 | 20milliseconds.com
21:24ã®æšã2014幎12æ4æ¥ã«ã¯ãã¢ã¬ãã¯ã¹ã»ã²ã€ããŒ[email protected]
æžããŸããïŒ
urllib3ã§ãã³ãããŒã¯ãå®è¡ããã ãã§ãã
PyPyïŒ120MB /ç§
CPythonïŒ70MB /ç§ãããŠãCPython +ãªã¯ãšã¹ããåå®è¡ããŸããïŒ35MB /ç§
ïŒç§ã®ãã·ã³ã¯ããã³ãããŒã¯ã§ããªãã®ãã€ãºãçºçããŠããããã§ãã
誰ãããããã䜿çšã§ããããéããªã·ã¹ãã ãæã£ãŠããŸããããã¯çŽ æŽãããã§ãããïŒâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65748982
ã
ãã³ãããŒã¯ãå®è¡ããããããã®ã§ãä»ã®äººãç§ã®æ°å€ã確èªã§ããããã«ãªããŸããã
CPythonïŒ
BENCH SOCKET:
8GiB 0:00:22 [ 360MiB/s] [======================================================>] 100%
BENCH HTTPLIB:
8GiB 0:02:34 [53.1MiB/s] [======================================================>] 100%
BENCH URLLIB3:
8GiB 0:01:30 [90.2MiB/s] [======================================================>] 100%
BENCH REQUESTS
8GiB 0:01:30 [90.7MiB/s] [======================================================>] 100%
BENCH GO HTTP
8GiB 0:00:26 [ 305MiB/s] [======================================================>] 100%
PyPyïŒ
BENCH SOCKET:
8GiB 0:00:22 [ 357MiB/s] [======================================================>] 100%
BENCH HTTPLIB:
8GiB 0:00:43 [ 189MiB/s] [======================================================>] 100%
BENCH URLLIB3:
8GiB 0:01:07 [ 121MiB/s] [======================================================>] 100%
BENCH REQUESTS
8GiB 0:01:09 [ 117MiB/s] [======================================================>] 100%
BENCH GO HTTP
8GiB 0:00:26 [ 307MiB/s] [======================================================>] 100%
ãããš...ãããã®æ°åã¯å¥åŠã§ãã CPythonã®httplibã¯ãäž¡æ¹ã®ã©ã€ãã©ãªãhttplibã䜿çšããŠããå Žåã§ããrequestsãŸãã¯urllib3ãããäœéã§ãã ããã¯æ£ããããããŸããã
ãããã¯ç§ã®ããã«äžè²«ããŠåçŸããŸã-ãã³ãããŒã¯ãè©ŠããŠã¿ãŠã
åçŸã§ããŸããïŒ ã§ãããšä»®å®ããŠãäœãåé¡ããããŸãã
ãã³ãããŒã¯ïŒ
åå11æ16å45ç§AMã³ãŒãªãŒãã³ãã£ãŒã«ãã§é2014幎12æ5æ¥ã«ã¯[email protected]
æžããŸããïŒ
ãããš...ãããã®æ°åã¯å¥åŠã§ãã CPythonã®httplibã¯ãªã¯ãšã¹ããããé ãã
äž¡æ¹ã®ã©ã€ãã©ãªãhttplibã䜿çšããŠããå Žåã§ããurllib3ïŒ ããã¯æ£ããããããŸãããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65821989
ã
ç§ã¯ä»ãæ¢ç¥ã®éããªãã·ã³ãã€ããã§ããŸãã ããã¯ã€ã³ã¹ããŒã«ããå¿ èŠãããç©ççãªããã¯ã¹ã§ãããããå©çšå¯èœã«ãªããŸã§ã«æ°åãããã¯ãã§ãïŒç§ã¯MAASã倧奜ãã§ãïŒã
CPython 2.7.8
BENCH SOCKET:
8GiB 0:00:26 [ 309MiB/s] [================================>] 100%
BENCH HTTPLIB:
8GiB 0:02:24 [56.5MiB/s] [================================>] 100%
BENCH URLLIB3:
8GiB 0:01:42 [79.7MiB/s] [================================>] 100%
BENCH REQUESTS
8GiB 0:01:45 [77.9MiB/s] [================================>] 100%
BENCH GO HTTP
8GiB 0:00:27 [ 297MiB/s] [================================>] 100%
ããã䟡å€ããããã®ã®ããã«ïŒ
ãã®ãããã CPython 3.4.2
ïŒ
BENCH SOCKET:
8GiB 0:00:27 [ 302MiB/s] [================================>] 100%
BENCH HTTPLIB:
8GiB 0:00:53 [ 151MiB/s] [================================>] 100%
BENCH URLLIB3:
8GiB 0:00:54 [ 149MiB/s] [================================>] 100%
BENCH REQUESTS
8GiB 0:00:56 [ 144MiB/s] [================================>] 100%
BENCH GO HTTP
8GiB 0:00:31 [ 256MiB/s] [================================>] 100%
Python2ã§ãåãå¹æãåŸãããã¯ãã§ãã
env PYTHONUNBUFFERED=
ãŸãã¯-u
ãã©ã°ã
åå11æ42å36ç§AMã³ãŒãªãŒãã¡ãŒãŠã§ã«ã§é2014幎12æ5æ¥ã«ã¯[email protected]
æžããŸããïŒ
ããã䟡å€ããããã®ã®ããã«ïŒ
ãã®ãããhttps://gist.github.com/frewsxcv/1c0f3c81cda508e1bca9ãCPython
3.4.2ïŒãã³ããœã±ããïŒ
8GiB 0:00:27 [302MiB / s] [================================>] 100ïŒ
ãã³ãHTTPLIBïŒ
8GiB 0:00:53 [151MiB / s] [================================>] 100ïŒ
ãã³ãURLLIB3ïŒ
8GiB 0:00:54 [149MiB / s] [================================>] 100ïŒ
ãã³ããªã¯ãšã¹ã
8GiB 0:00:56 [144MiB / s] [================================>] 100ïŒ
BENCH GO HTTP
8GiB 0:00:31 [256MiB / s] [================================>] 100ïŒâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65826239
ã
@alexèå³æ·±ãããšã«ã env PYTHONUNBUFFERED=
ã-u
ãPython2ã«åã圱é¿ãäžããŸãããç§ã®ãã·ã³ã®åä¿¡çµæã
äºè§£ããŸããã以äžã®ããŒã¿ã¯ããããã®ãã¹ããå®è¡ããŠããã ãã®ãã·ã³ããã®ãã®ã§ãã æåŸã®ãã¹ãã¯ãPython -u
ãã©ã°ãèšå®ããŠå®è¡ãããŸããããã芧ã®ãšããããã©ã°ã¯å¹æããããŸããã
Python 2.7.6
go version go1.2.1 linux/amd64
BENCH SOCKET:
8GiB 0:00:16 [ 500MiB/s] [================================>] 100%
BENCH HTTPLIB:
8GiB 0:01:32 [88.6MiB/s] [================================>] 100%
BENCH URLLIB3:
8GiB 0:01:20 [ 101MiB/s] [================================>] 100%
BENCH REQUESTS
8GiB 0:01:21 [ 100MiB/s] [================================>] 100%
BENCH GO HTTP
8GiB 0:00:21 [ 385MiB/s] [================================>] 100%
Python 2.7.6
go version go1.2.1 linux/amd64
BENCH SOCKET:
8GiB 0:00:16 [ 503MiB/s] [================================>] 100%
BENCH HTTPLIB:
8GiB 0:01:33 [87.8MiB/s] [================================>] 100%
BENCH URLLIB3:
8GiB 0:01:20 [ 101MiB/s] [================================>] 100%
BENCH REQUESTS
8GiB 0:01:22 [99.3MiB/s] [================================>] 100%
BENCH GO HTTP
8GiB 0:00:20 [ 391MiB/s] [================================>] 100%
Python 2.7.6
go version go1.2.1 linux/amd64
BENCH SOCKET:
8GiB 0:00:16 [ 506MiB/s] [================================>] 100%
BENCH HTTPLIB:
8GiB 0:01:31 [89.1MiB/s] [================================>] 100%
BENCH URLLIB3:
8GiB 0:01:20 [ 101MiB/s] [================================>] 100%
BENCH REQUESTS
8GiB 0:01:20 [ 101MiB/s] [================================>] 100%
BENCH GO HTTP
8GiB 0:00:21 [ 389MiB/s] [================================>] 100%
ãããã®æ°å€ã¯éåžžã«å®å®ããŠããã次ã®æ©èœã瀺ããŠããŸãã
FWIWã @ kevinburkeããbuffering=True
ãè¿œå ããŠããŒãžããŸãããå®è¡ããŠãã ãã
ãããå«ããŸããïŒ
12æ04å40ç§PMã³ãŒãªãŒãã³ãã£ãŒã«ãã§é2014幎12æ5æ¥ã«ã¯[email protected]
æžããŸããïŒ
äºè§£ããŸããã以äžã®ããŒã¿ã¯ãä»ã«äœãããŠããªããã·ã³ããã®ãã®ã§ãã
ãããããããã®ãã¹ããå®è¡ããŸãã æåŸã®ãã¹ãã¯Python-uãã©ã°ã䜿çšããŠå®è¡ãããŸãã
ãèšå®ãããšãã芧ã®ãšããããã©ã°ã¯å¹æããããŸãããPython 2.7.6
goããŒãžã§ã³go1.2.1linux / amd64
ãã³ããœã±ããïŒ
8GiB 0:00:16 [500MiB / s] [================================>] 100ïŒ
ãã³ãHTTPLIBïŒ
8GiB 0:01:32 [88.6MiB / s] [================================>] 100ïŒ
ãã³ãURLLIB3ïŒ
8GiB 0:01:20 [101MiB / s] [================================>] 100ïŒ
ãã³ããªã¯ãšã¹ã
8GiB 0:01:21 [100MiB / s] [================================>] 100ïŒ
BENCH GO HTTP
8GiB 0:00:21 [385MiB / s] [================================>] 100ïŒPython 2.7.6
goããŒãžã§ã³go1.2.1linux / amd64
ãã³ããœã±ããïŒ
8GiB 0:00:16 [503MiB / s] [================================>] 100ïŒ
ãã³ãHTTPLIBïŒ
8GiB 0:01:33 [87.8MiB / s] [================================>] 100ïŒ
ãã³ãURLLIB3ïŒ
8GiB 0:01:20 [101MiB / s] [================================>] 100ïŒ
ãã³ããªã¯ãšã¹ã
8GiB 0:01:22 [99.3MiB / s] [================================>] 100ïŒ
BENCH GO HTTP
8GiB 0:00:20 [391MiB / s] [================================>] 100ïŒPython 2.7.6
goããŒãžã§ã³go1.2.1linux / amd64
ãã³ããœã±ããïŒ
8GiB 0:00:16 [506MiB / s] [================================>] 100ïŒ
ãã³ãHTTPLIBïŒ
8GiB 0:01:31 [89.1MiB / s] [================================>] 100ïŒ
ãã³ãURLLIB3ïŒ
8GiB 0:01:20 [101MiB / s] [================================>] 100ïŒ
ãã³ããªã¯ãšã¹ã
8GiB 0:01:20 [101MiB / s] [================================>] 100ïŒ
BENCH GO HTTP
8GiB 0:00:21 [389MiB / s] [================================>] 100ïŒãããã®æ°å€ã¯éåžžã«å®å®ããŠããã次ã®æ©èœã瀺ããŠããŸãã
- rawãœã±ããã®èªã¿åãã¯é«éã§ãïŒduhïŒã
- Goã¯ãrawãœã±ããèªã¿åãã®çŽ80ïŒ ã®é床ã§ãã
- urllib3ã¯ãrawãœã±ããèªã¿åãã®çŽ20ïŒ ã®é床ã§ãã
- ãªã¯ãšã¹ãã¯urllib3ãããå°ãé ãã§ãã
ããŒã¿ãééããã¹ã¿ãã¯ãã¬ãŒã ãããã€ãè¿œå ããŸãã- httplibã¯requests / urllib3ãããé ãã§ãã ããã¯äžå¯èœã§ãã
ã§httplibãŸãã¯ãœã±ããã©ã€ãã©ãªãæ§æããå¿ èŠããããšæããŸã
httplibãããã§ã¯ãªãæ¹æ³ãâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65829335
ã
Cory-ããªã³ã«ãããã³ãã¯ã©ã€ã¢ã³ãã®ææ°ããŒãžã§ã³ãåç
§ããŠãã ãã
buffering = True in httplibïŒrequests / urllib3ãšåæ§ïŒ
ã±ãã³ã»ããŒã¯
é»è©±çªå·ïŒ925.271.7005 | 20milliseconds.com
10ïŒ04 AMã§éã2014幎12æ5æ¥ã«ã¯ãã³ãŒãªãŒãã³ãã£ãŒã«ã[email protected]
æžããŸããïŒ
äºè§£ããŸããã以äžã®ããŒã¿ã¯ãä»ã«äœãããŠããªããã·ã³ããã®ãã®ã§ãã
ãããããããã®ãã¹ããå®è¡ããŸãã æåŸã®ãã¹ãã¯Python-uãã©ã°ã䜿çšããŠå®è¡ãããŸãã
ãèšå®ãããšãã芧ã®ãšããããã©ã°ã¯å¹æããããŸãããPython 2.7.6
goããŒãžã§ã³go1.2.1linux / amd64
ãã³ããœã±ããïŒ
8GiB 0:00:16 [500MiB / s] [================================>] 100ïŒ
ãã³ãHTTPLIBïŒ
8GiB 0:01:32 [88.6MiB / s] [================================>] 100ïŒ
ãã³ãURLLIB3ïŒ
8GiB 0:01:20 [101MiB / s] [================================>] 100ïŒ
ãã³ããªã¯ãšã¹ã
8GiB 0:01:21 [100MiB / s] [================================>] 100ïŒ
BENCH GO HTTP
8GiB 0:00:21 [385MiB / s] [================================>] 100ïŒPython 2.7.6
goããŒãžã§ã³go1.2.1linux / amd64
ãã³ããœã±ããïŒ
8GiB 0:00:16 [503MiB / s] [================================>] 100ïŒ
ãã³ãHTTPLIBïŒ
8GiB 0:01:33 [87.8MiB / s] [================================>] 100ïŒ
ãã³ãURLLIB3ïŒ
8GiB 0:01:20 [101MiB / s] [================================>] 100ïŒ
ãã³ããªã¯ãšã¹ã
8GiB 0:01:22 [99.3MiB / s] [================================>] 100ïŒ
BENCH GO HTTP
8GiB 0:00:20 [391MiB / s] [================================>] 100ïŒPython 2.7.6
goããŒãžã§ã³go1.2.1linux / amd64
ãã³ããœã±ããïŒ
8GiB 0:00:16 [506MiB / s] [================================>] 100ïŒ
ãã³ãHTTPLIBïŒ
8GiB 0:01:31 [89.1MiB / s] [================================>] 100ïŒ
ãã³ãURLLIB3ïŒ
8GiB 0:01:20 [101MiB / s] [================================>] 100ïŒ
ãã³ããªã¯ãšã¹ã
8GiB 0:01:20 [101MiB / s] [================================>] 100ïŒ
BENCH GO HTTP
8GiB 0:00:21 [389MiB / s] [================================>] 100ïŒãããã®æ°å€ã¯éåžžã«å®å®ããŠããã次ã®æ©èœã瀺ããŠããŸãã
- rawãœã±ããã®èªã¿åãã¯é«éã§ãïŒduhïŒã
- Goã¯ãrawãœã±ããèªã¿åãã®çŽ80ïŒ ã®é床ã§ãã
- urllib3ã¯ãrawãœã±ããèªã¿åãã®çŽ20ïŒ ã®é床ã§ãã
- ãªã¯ãšã¹ãã¯urllib3ãããå°ãé ãã§ãã
ããŒã¿ãééããã¹ã¿ãã¯ãã¬ãŒã ãããã€ãè¿œå ããŸãã- httplibã¯requests / urllib3ãããé ãã§ãã ããã¯äžå¯èœã§ãã
ã§httplibãŸãã¯ãœã±ããã©ã€ãã©ãªãæ§æããå¿ èŠããããšæããŸã
httplibãããã§ã¯ãªãæ¹æ³ãâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65829335
ã
ãããããã¯ã¯ããã«çã«ããªã£ãŠããããã«httplibã®ããã©ãŒãã³ã¹ã®æ¯ãèããä¿®æ£ããŸãã
æ°ããçµæãšçµè«ïŒ
Python 2.7.6
go version go1.2.1 linux/amd64
BENCH SOCKET:
8GiB 0:00:16 [ 499MiB/s] [================================>] 100%
BENCH HTTPLIB:
8GiB 0:01:12 [ 113MiB/s] [================================>] 100%
BENCH URLLIB3:
8GiB 0:01:21 [ 100MiB/s] [================================>] 100%
BENCH REQUESTS
8GiB 0:01:20 [ 101MiB/s] [================================>] 100%
BENCH GO HTTP
8GiB 0:00:20 [ 391MiB/s] [================================>] 100%
ãããã£ãŠãããããããã§ã®å®éã®ã³ã¹ãã¯httplibã§ãã ãããé«éåããã«ã¯ãhttplibãéªéã«ãªããªãããã«ããå¿ èŠããããŸãã
httplibã®ã©ã®éšåãç§ãã¡ã«ã³ã¹ãããããŠããã®ãã解æããããšã«èå³ããããŸãã bench_httplib.py
ãããã¡ã€ãªã³ã°ã¯æ¬¡ã®è¯ãã¹ãããã ãšæããŸãã
bench_socket.py
ãã¹ãã«ãã®è¡ãè¿œå ããããšã§ã socket.makefile
ãä»ãããœã±ãããããã¡ã€ã«ãªããžã§ã¯ããžã®å€æãé€å€ããŸããããé床ã¯ãŸã£ããäœäžããŸããã å¥åŠãªããšã«ãããã¯ãããããéãããããã«èŠããŸãã
çãã¯ã»ãŒç¢ºå®ã«è»¢éãšã³ã³ãŒãã£ã³ã°ã§ãïŒãã£ã³ã¯åŠçã
åç
§ïŒ https ïŒ
ãµãŒããŒäžã®Content-Lengthã¯ãäºæããªãçµæãçæããŸãã
12æ24å53ç§PMã³ãŒãªãŒãã³ãã£ãŒã«ãã§é2014幎12æ5æ¥ã«ã¯[email protected]
æžããŸããïŒ
ãããã£ãŠãããããããã§ã®å®éã®ã³ã¹ãã¯httplibã§ãã ãããã¹ããŒãã¢ããããã«ã¯
httplibãéªéã«ãªããªãããã«ããŸããhttplibã®ã©ã®éšåãç§ãã¡ã«ã³ã¹ãããããŠããã®ãã解æããããšã«èå³ããããŸãã ç§
次ã®ã¹ããããšããŠãbench_httplib.pyã®ãããã¡ã€ãªã³ã°ãé©åã ãšæããŸããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65831653
ã
é¢çœãã
ãã£ã³ã¯åŠçã¯ã»ãŒç¢ºå®ã«åé¡ã§ãããç¹ã«ãã£ã³ã¯ãgoã®ããã©ã«ãã®HTTPã¢ãŒãã§ãããããgoããããããé©åã«åŠçããããšã«ããã»ã©é©ããŠããŸããã
ãã ããrawãœã±ãããããé«éãªãªã¯ãšã¹ãã¯...äºæããªããã®ã§ãã
泚ç®ã«å€ããããšã®1ã€ã¯ããœã±ãããåã®ãã¹ãã§ãã£ã³ã¯ãšã³ã³ãŒãã£ã³ã°ããã³ãŒãããŠããªãã£ãå Žåãä»ã®æ¹æ³ãããå®éã«èªã¿åãããŒã¿ãå°ãªããããäžåœãªå©ç¹ããããŸããã 圌ãã¯å šå¡ããã£ã³ã¯åãããããããŒãš8GBã®ããŒã¿ãèªã¿åã£ãŠããŸããã
ããã¯æ¬¡ã®è³ªåã«ã€ãªãããŸãïŒãããã®ã¡ãœããã®ãã¹ãŠãå®éã«åãéã®ããŒã¿ãèªã¿åã£ãŠãããšç§ãã¡ã¯ãŸã èããŠããŸããïŒ
ã¯ãããœã±ããã¬ã€ã€ãŒã¯äžæ£è¡çºãããŠããŸããããã£ã³ã¯åãããã¡ã¿ããŒã¿ããã³ãŒãããŸããã§ããã
æè¡çã«ã¯å°ãèªã¿ã«ãããªã£ãŠããŸãã ããã¯ãã©ãã ãéããã®åºç€ãšããŠããã«ãããŸãã
ç§ãã¡ã¯èªãããšãã§ããŸããããäœã蚌æããããã§ã¯ãããŸããã
åå12æ33å10ç§PMã³ãŒãªãŒãã³ãã£ãŒã«ãã§é2014幎12æ5æ¥ã«ã¯[email protected]
æžããŸããïŒ
é¢çœãã
ãã£ã³ã¯åŠçã¯ã»ãŒç¢ºå®ã«åé¡ã§ãããç§ã¯å®éã«ã¯ããã§ã¯ãããŸãã
ç¹ã«ãã£ã³ã¯ãããã©ã«ãã§ãããããgoããããããé©åã«åŠçããããšã«é©ããŠããŸã
goã®HTTPã¢ãŒãããã ããrawãœã±ãããããé«éãªãªã¯ãšã¹ãã¯...äºæããªããã®ã§ãã
泚ç®ã«å€ãã1ã€ã®ããšïŒãœã±ããããã£ã³ã¯ãšã³ã³ãŒãã£ã³ã°ããã³ãŒãããŠããªãã£ãå Žå
以åã®ãã¹ãã§ã¯ãå®éã«ã¯ããã§ãã£ãããã«ãããã¯äžå ¬å¹³ãªå©ç¹ãåŸãŸãã
ä»ã®æ¹æ³ãããå°ãªãããŒã¿ãèªã¿åãïŒ åœŒãã¯çèªãã§ãã
ãã£ã³ã¯åãããããããŒãš8GBã®ããŒã¿ãããã¯æ¬¡ã®è³ªåã«ã€ãªãããŸãïŒç§ãã¡ã¯ãŸã ãããã®æ¹æ³ã®ãã¹ãŠãèããŠããŸããïŒ
å®éã«åãéã®ããŒã¿ãèªã¿åã£ãŠããŸããïŒâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65833299
ã
ããããäžåºŠã«ãœã±ããããèªã¿åã£ãŠãããã£ã³ã¯ãµã€ãºã«é¢é£ããŠããŠãé©ããªãã§ãããã
éåžžã«åœ¹ç«ã€@alexã®ã±ãŒãïŒcakeïŒ
@nelhageã¯ãããŸããŸãªäŸã®ããã€ãã®ã¹ãã¬ãŒã·ã³ã°ãè¡ããŸããïŒè»¢éã§
ãšã³ã³ãŒãã£ã³ã°ïŒãã£ã³ã¯ã±ãŒã¹ïŒ https://gist.github.com/nelhage/dd6490fbc5cfb815f762
çµæã§ãã httplibã«ãã°ãããããã®çµæã
åžžã«ãœã±ããããå®å
šãªãã£ã³ã¯ãèªã¿åããšã¯éããŸããã
åå9æ05å14ç§AMã±ãã¹Reitzæ°ã§æ2014幎12æ8æ¥ã«ã¯[email protected]
æžããŸããïŒ
@alexã®ã±ãŒãhttps://github.com/alexéåžžã«åœ¹ç«ã€[ç»åïŒ
ïŒã±ãŒãïŒ]â
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -66147998
ã
ã§ã¯ãããã«ããã®ã¯ã誰ãå®éã«ä¿å®ããŠããªãæšæºã©ã€ãã©ãªã®ãã°ã§ããïŒ ïŒ @Lukasaã«ã¯ã1幎以äžéããŠãããããã»ãããå°ãªããšã2ã€ãããŸããïŒãã¶ããä»å€ã©ããã§ãªã¹ãã«æªèã
誰ãïŒç§ã¯ããã«å°éãããããããŸããããäžæã§ãïŒã¯ããããpdbã§ããªã«ããŠã³ããå¿
èŠããããŸã
ãŸãã¯äœããããŠããããã®20ãã€ããçæããŠããæ£ç¢ºãªã³ãŒããææ¡ããŸã
è¯ããã°ã¬ããŒãããŸãšããããããã«èªã¿ãŸãã
ååä¹æ14å09ç§AMã€ã¢ã³Cordascoã§æ2014幎12æ8æ¥ã«ã¯[email protected]
æžããŸããïŒ
ã€ãŸããããã«ããã®ã¯ãæšæºã©ã€ãã©ãªã®ãã°ã§ãããå®éã«ã¯èª°ãããªããšããããšã§ãã
ç¶æããŸããïŒ ïŒ @Lukasahttps ïŒ//github.com/Lukasaã«ã¯å°ãªããšã2ã€ã®ãããããããŸã
1幎以äžãªãŒãã³ããŠããã»ããã§ããïŒãã¶ãç§ã¯ãªã¹ãã«æªèãæŸã¡ãŸã
ä»å€ã©ããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/kennethreitz/requests/issues/2371#issuecomment -66149522
ã
誰ãããã«å°éããªãå Žåãç§ã¯ä»å€ãŸãã¯ææ¥ã«ãããé©åãããããšããŸãã
ããã§ãæ ¹æ¬çãªåå ã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ ãããã®çãèªã¿åããçæããŠããã®ã¯äœã§ããïŒãŸãããããããªããšç¶æ³ã¯ã©ã®çšåºŠæ¹åãããŸããïŒ
@kislyukç§ãç¥ãéãã§ã¯ãããŸããã ããŸãããã°ãç§ã¯ãã®ã¯ãªã¹ãã¹äŒæãè¿œããããæéããããŸãã
@Lukasaã«æè¬ããŸãã urllib3 / requestsã䜿çšãããã£ã³ã¯åãããå¿çã®ããŠã³ããŒãé床ãcurlãä»ã®ã©ã€ãã©ãªãããã¯ããã«é ããšããããã©ãŒãã³ã¹ã®åé¡ã«å¯ŸåŠããŠããããããåå ãã©ãããç解ããããšããŠããŸãã
ç§ã¯ãããå°ãçªã£ã€ããŠããŸããã çãèªã¿åãã¯ãhttplibã®_read_chunkedé¢æ°ããååŸãããŸã
https://fossies.org/linux/misc/Python-2.7.9.tgz/Python-2.7.9/Lib/httplib.py#l_585
2ãã€ãã®èªã¿åãã¯ãäž»ã«622è¡ç®ããã®ãã®ã®ããã§ãã
以åã«æçš¿ãããã®ãšã¯å°ãç°ãªãstraceãã¿ãŒã³ãååŸããŸããã
recvfromïŒ3ã "400 \ r \ n \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "...ã8192ã0ãNULLãNULLïŒ= 8192
recvfromïŒ3ã "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "...ã54ã0ãNULLãNULLïŒ= 54
recvfromïŒ3ã "\ r \ n"ã2ã0ãNULLãNULLïŒ= 2
ãã®ãã¿ãŒã³ã¯æ¬¡ã®ããã«èª¬æã§ããŸãã
ãã®åŸããã¿ãŒã³ãç¹°ãè¿ãããŸãïŒã¹ããã1ã«æ»ããŸãïŒ
FWIWãããã§ã¯ã2ãã€ãã®ãã£ã³ã¯ã¿ãŒãããŒã¿ãŒã®èªã¿åãããã£ã³ã¯æ¬äœã®èªã¿åãã«ããŒã«ã€ã³ããããšã§ãé©åºŠãªïŒ20ïŒ çšåºŠïŒé«éåãå¯èœã§ããããšãããããŸããã
value.append(self._safe_read(chunk_left))
amt -= chunk_left
self._safe_read(2) # toss the CRLF at the end of the chunk
代ããã«ãããè¡ããŸãïŒ
value.append(self._safe_read(chunk_left + 2)[:-2])
amt -= chunk_left
ãã ããå®éã«ã¯ã54ãã€ãã®èªã¿åãã§54ãã€ãïŒã€ãŸã8192ãã€ãïŒãããå€ãã®ãã€ãããããã¡ãªã³ã°ã§ããã°ãããããããè¯ãã§ããããã€ãŸãã2ãã€ãã®èªã¿åãã«é¢ããŠã¯ãããã¡ãªã³ã°ããããœã±ããã空ã«ãªããªããšããããšã§ãã
ããã«å ããŠã å°ããªèªã¿åããã¹ã«ãŒãããã®æ倱ã®äž»ãªèŠå ã§ãããã©ããã¯ããããŸããïŒãŸãã¯ããŒã«ã«ãã¹ãã§ã¯ãããŸããïŒã ãœã±ãããããã¡ãµã€ãºã1031ãã€ãã®åæ°ã«ãªãããã«è©ŠããŠã¿ãŸããããstraceã®èªã¿åããå°ãããªã£ãã«ãããããããã¹ã«ãŒãããã«å€§ããªåœ±é¿ã¯ãããŸããã§ããã
ã¹ã«ãŒãããã®äœäžã¯ãsocket.pyãå°ããªèªã¿åããåŠçããæ¹æ³ã«é¢ä¿ããŠããå¯èœæ§ããããšæããŸãã é¢é£ããã³ãŒãã¯æ¬¡ã®ãšããã§ãïŒsocket.readããïŒïŒ
https://fossies.org/linux/misc/Python-2.7.9.tgz/Python-2.7.9/Lib/socket.py#l_336
æ瀺çãªé·ããsocket.readã«æž¡ããæ¢åã®ãããã¡ãªã³ã°ãããããŒã¿ãããããå®è¡ã§ããå Žåãããã¯ã³ãŒããã¹ã§ãã
buf = self._rbuf
buf.seek(0, 2) # seek end
#.....
# Read until size bytes or EOF seen, whichever comes first
buf_len = buf.tell()
if buf_len >= size:
# Already have size bytes in our buffer? Extract and return.
buf.seek(0)
rv = buf.read(size)
self._rbuf = StringIO()
self._rbuf.write(buf.read())
return rv
ããã§ç§ãèªèããŠããåé¡ã¯ã2ãã€ãã®èªã¿åãã§ãããæªèªã®æ®ããæ°ããStringIOã«ã³ããŒããããšãæå³ãããšããããšã§ãã ããã¯ãå€ãã®å°ããªèªã¿åãã§ã¯éåžžã«é«äŸ¡ã«ãªãããã§ãã æªèªã®æ®ããæ°ããStringIOã«ã³ããŒããçŸåšã®ãã¿ãŒã³ã§ã¯ãªããç¹å®ã®StringIOãèªã¿åãããšã«äœããã®åœ¢ã§æåºãããå¯èœæ§ãããå Žåã¯ãã¹ã«ãŒãããã«åœ¹ç«ã€ãšæããŸãã
@gardeniaç§ã¯ããããã¹ãŠãåžåããæ©äŒããããŸããã§ããããããªãã®åªåãšããã§ã®ä»äºã«æè¬ããŸãã @shazowããããã @ gardeniaã®ç 究ã¯èå³æ·±ããšæãã§ãããã
ïŒ+1ïŒ@gardeniaã«æè¬ããŸãã ã¡ãªã¿ã«ãç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã®ããã©ãŒãã³ã¹ã«é¢ããç§èªèº«ã®èª¿æ»ã§ã¯ãç§ã®å Žåãå¿çã¯ãã£ã³ã¯åãããŠããªãããšãããããŸããããurllib3ã¯èŠæ±ããã20ïŒ ä»¥äžé«éã§ãããããç¹åŸŽã¥ããããªãŒããŒããããããã€ãå°å ¥ãããŠããŸãã ãŸã ãã®åé¡ã®ã¿ã€ãã«ãšäžèŽããŠããŸãããæ ¹æ¬çãªåå ã¯ç°ãªããŸãã
é åçã§ããå ±æããŠãããŠããããšãïŒ :)
@Lukasaã®HyperãåãçµãæããŸãã
@ alex-ç§ã¯ããªããèšåãããã£ã³ã¯ãããŠããªãããã©ãŒãã³ã¹ã®åé¡ã«å¯ŸããŠurllib3vsrequestsãå°ãããããŸããã ãªã¯ãšã¹ããåæ§ã«20ïŒ æžå°ãããšæããŸãã
ãªã¯ãšã¹ãã§ã¯ãself.raw.streamã®åŒã³åºããïŒurllib3ããã®ïŒstreamïŒïŒã®ã€ã³ã©ã€ã³å®è£ ã«çœ®ãæããããšæšæž¬ããŸããã å°ãªããšãç§ã®ãã·ã³ã§ã¯ããªã¯ãšã¹ããšurllib3ã®éã§ã¹ã«ãŒããããå€§å¹ ã«è¿ããªãããã§ããã
--- requests.repo/requests/models.py 2015-03-06 16:05:52.072509869 +0000
+++ requests/models.py 2015-03-07 20:49:25.618007438 +0000
@@ -19,6 +19,7 @@
from .packages.urllib3.fields import RequestField
from .packages.urllib3.filepost import encode_multipart_formdata
from .packages.urllib3.util import parse_url
+from .packages.urllib3.util.response import is_fp_closed
from .packages.urllib3.exceptions import (
DecodeError, ReadTimeoutError, ProtocolError, LocationParseError)
from .exceptions import (
@@ -652,8 +654,12 @@
try:
# Special case for urllib3.
try:
- for chunk in self.raw.stream(chunk_size, decode_content=True):
- yield chunk
+ while not is_fp_closed(self.raw._fp):
+ data = self.read(amt=chunk_size, decode_content=True)
+
+ if data:
+ yield data
+
except ProtocolError as e:
raise ChunkedEncodingError(e)
except DecodeError as e:
ãã¶ããããªãã¯ãããããªãã«ãéãããããããã©ããèŠãããã«ããªãã®ãã·ã³ã§åãããšãè©Šã¿ãããšãã§ããŸãã
ïŒã¯ããis_fp_closedã®åŒã³åºãã¯ã«ãã»ã«åã®ç¡å¹åã§ããããšãããã£ãŠããŸããããã¯ãåãªãããŒã¿ãã€ã³ãã§ããé倧ãªããããæå³ãããã®ã§ã¯ãããŸããïŒ
@shazowãã€ããŒã䜿çšããBufferedSocket
ããæ¬è³ªçã«å°ããªèªã¿åããé²ãããšã«ãã£ãŠããã®éå¹çæ§ã®å€ãã«å¯ŸåŠããããšãé¡ã£ãŠããŸãã Py3ã®httplib
ã¯ã io.BufferedReader
åºç¯å²ã«äœ¿çšããããããã®åé¡ãããã®ã§ã¯ãªãããšæããŸããããã¯ã BufferedSocket
ãšã»ãŒåãçš®é¡ã®å©ç¹ãæäŸããã¯ãã§ãã
ãã ãã確ãã«ã hyper
ãååã«HTTP / 1.1æ©èœãæ¡åŒµããŠåœ¹ç«ã€ããã«ãªã£ããããããã®ä»ã®å®è£
ãšäžç·ã«ãã³ãããŒã¯ãè¡ãã hyper
ãã§ããã ãéãããããã«åªåããå¿
èŠããããŸãã
ã»ãŒ1幎ééã¢ã¯ãã£ãã ééã
ç§ã¯10å以äžäœ¿çšããŠrequests
ãšæ¯èŒããŠã urllib3
ã
ãã®åé¡ã¯urllib3ã®HTTPResponse
ã¯ã©ã¹å
ã«ãããšæããŸããã€ãã¬ãŒã¿ãšããŠèªã¿åããããšãã¹ã«ãŒããããéåžžã«æªããªããŸãã ã³ãŒããéåžžã«éãããã¯ã§åäœãããŸãããurllib3ã§äœ¿çšãããŠããäžç·ä»ãã®httplib.HTTPResponse
ãªããžã§ã¯ããè¿ããŸããããã§ãã¹ã«ãŒãããã®åé¡ã解決ããããã§ãã
èå³æ·±ãäºå®ïŒurllib3ã®HTTPResponse
ã¹ãŒããŒã¯ã©ã¹ã¯io.IOBase
ã§ãã Python3ã®httplib.HTTPResponse
ã¹ãŒããŒã¯ã©ã¹ã¯io.BufferedIOBase
ã§ãã ãããšé¢ä¿ãããã®ãââããã