<p>μš”μ²­μ— μ„±λŠ₯이 쒋지 μ•Šμ€ 슀트리밍 큰 λ°”μ΄λ„ˆλ¦¬ 응닡</p>

에 λ§Œλ“  2014λ…„ 12μ›” 05일  Β·  40μ½”λ©˜νŠΈ  Β·  좜처: psf/requests

https://github.com/alex/http-client-bench μ—λŠ” λ‚΄κ°€ μ‚¬μš©ν•œ λ²€μΉ˜λ§ˆν¬κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

| | μš”μ²­/http | μ†ŒμΌ“ |
| --- | --- | --- |
| CPython | 12MB/s | 200MB/s |
| 파이파이 | 80MB/s | 300MB/s |
| 이동 | 150MB/s | ν•΄λ‹Ή μ—†μŒ |

μš”μ²­μ€ 특히 CPythonμ—μ„œ μ†ŒμΌ“μ— λΉ„ν•΄ μƒλ‹Ήν•œ μ˜€λ²„ν—€λ“œλ₯Ό λΆ€κ³Όν•©λ‹ˆλ‹€.

Propose Close

λͺ¨λ“  40 λŒ“κΈ€

μ˜€λ²„ν—€λ“œκ°€ μ˜ˆμƒμ™Έλ‘œ ν½λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것을 ν”Όν•˜λŠ” 것은 κΉŒλ‹€λ‘œμšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

큰 λ¬Έμ œλŠ” μš°λ¦¬κ°€ 청크당 κ½€ λ§Žμ€ 처리λ₯Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것이 μŠ€νƒμ˜ λͺ¨λ“  κ²ƒμž…λ‹ˆλ‹€: requests, urllib3 및 httplib. λˆ„κ°€ λΉ„νš¨μœ¨μ„±μ„ μœ λ°œν•˜λŠ”μ§€ μ•Œμ•„λ‚΄κΈ° μœ„ν•΄ μ‹œκ°„μ„ 어디에 μ†ŒλΉ„ν•˜λŠ”μ§€ λ³΄λŠ” 것은 맀우 ν₯미둜울 κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒ λ‹¨κ³„λŠ” httplib / urllib3을 ν”„λ‘œνŒŒμΌλ§ν•˜μ—¬
κ±°κΈ° μ„±λŠ₯?

μΌ€λΉˆ 버크
μ „ν™”: 925.271.7005 | 20λ°€λ¦¬μ΄ˆ.com

2014λ…„ 12μ›” 4일 λͺ©μš”일 μ˜€ν›„ 5:01 Cory Benfield μ•Œλ¦Ό @github.com
썼닀:

μ˜€λ²„ν—€λ“œκ°€ μ˜ˆμƒμ™Έλ‘œ ν½λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것을 ν”Όν•˜λŠ” 것은 κΉŒλ‹€λ‘œμšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

큰 λ¬Έμ œλŠ” μš°λ¦¬κ°€ 청크당 κ½€ λ§Žμ€ 처리λ₯Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 그건
μŠ€νƒ μ•„λž˜λ‘œ: requests, urllib3 및 httplib. 그것은
λˆ„κ°€ μ‹œκ°„μ„ μ†ŒλΉ„ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 것은 맀우 ν₯λ―Έ λ‘­μŠ΅λ‹ˆλ‹€.
λΉ„νš¨μœ¨μ„ μ΄ˆλž˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65732050
.

urllib3으둜 벀치마크λ₯Ό μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

파이파이: 120MB/s
CPython: 70MB/s

그리고 CPython + μš”μ²­μ„ λ‹€μ‹œ μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 35MB/s

(λ‚΄ κΈ°κ³„λŠ” λ²€μΉ˜λ§ˆν¬μ—μ„œ μ•½κ°„μ˜ μ†ŒμŒμ„ κ²½ν—˜ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€κ°€ 더 μ‘°μš©ν•œ μ‹œμŠ€ν…œμ„ 가지고 μžˆλ‹€λ©΄ ꡉμž₯ν•  κ²ƒμž…λ‹ˆλ‹€.)

λ‚˜λŠ” λ‹€λ₯Έ λͺ¨λ“  것을 μ’…λ£Œ ν•œ ν›„ λ‚΄ μ»΄ν“¨ν„°μ—μ„œ 이것을 μ‹€ν–‰ν•˜λ €κ³  μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€.
μ‘μš© ν”„λ‘œκ·Έλž¨ 및 터미널 μ°½κ³Ό μƒλ‹Ήν•œ μ–‘μ˜ μ†ŒμŒμ΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
μ†ŒμΌ“ λ²€μΉ˜λ§ˆν¬λŠ” 30mb/sμ—μ„œ 460mb/s μ‚¬μ΄μ˜€μŠ΅λ‹ˆλ‹€.

μΌ€λΉˆ 버크
μ „ν™”: 925.271.7005 | 20λ°€λ¦¬μ΄ˆ.com

2014λ…„ 12μ›” 4일 λͺ©μš”일 μ˜€ν›„ 9μ‹œ 24λΆ„, Alex Gaynor [email protected]
썼닀:

urllib3으둜 벀치마크λ₯Ό μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

파이파이: 120MB/s
CPython: 70MB/s

그리고 CPython + μš”μ²­μ„ λ‹€μ‹œ μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 35MB/s

(λ‚΄ μ»΄ν“¨ν„°λŠ” λ²€μΉ˜λ§ˆν¬μ—μ„œ μ•½κ°„μ˜ μ†ŒμŒμ΄ λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
λˆ„κ΅¬λ“ μ§€ μ‚¬μš©ν•  수 μžˆλŠ” 더 μ‘°μš©ν•œ μ‹œμŠ€ν…œμ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ 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%

파이파이:

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%

μ–΄...μˆ«μžκ°€ μ΄μƒν•˜λ„€μš”. 두 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λͺ¨λ‘ httplibλ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ CPython의 httplibλŠ” μš”μ²­ λ˜λŠ” urllib3보닀 λŠλ¦½λ‹ˆλ‹€. 그것은 μ˜³μ„ 수 μ—†μŠ΅λ‹ˆλ‹€.

그듀은 λ‚˜λ₯Ό μœ„ν•΄ μΌκ΄€λ˜κ²Œ μž¬μƒμ‚°ν•©λ‹ˆλ‹€. 벀치마크λ₯Ό μ‹œλ„ν•˜κ³ 
μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? 당신이 ν•  수 μžˆλ‹€κ³  κ°€μ •ν•˜κ³ , 당신은 μ–΄λ–€ λ¬Έμ œκ°€
벀치마크?

2014λ…„ 12μ›” 5일 κΈˆμš”μΌ μ˜€μ „ 11:16:45 Cory Benfield [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 ν”Œλž˜κ·Έ.

2014λ…„ 12μ›” 5일 κΈˆμš”μΌ μ˜€μ „ 11:42:36 Corey Farwell [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%
벀치 GO HTTP
8GiB 0:00:31 [ 256MiB/s] [================================>] 100%

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65826239
.

@alex ν₯λ―Έλ‘­κ²Œλ„ env PYTHONUNBUFFERED= λ˜λŠ” -u λŠ” Python 2μ—μ„œ λ™μΌν•œ 효과λ₯Ό λ‚˜νƒ€λ‚΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄ μ»΄ν“¨ν„°μ—μ„œ λ“€μ–΄μ˜€λŠ” κ²°κ³Όμž…λ‹ˆλ‹€.

μ’‹μŠ΅λ‹ˆλ‹€. μ•„λž˜ λ°μ΄ν„°λŠ” 이 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λŠ” 것 μ™Έμ—λŠ” 아무 것도 ν•˜μ§€ μ•ŠλŠ” μ‹œμŠ€ν…œμ—μ„œ κ°€μ Έμ˜¨ κ²ƒμž…λ‹ˆλ‹€. λ§ˆμ§€λ§‰ ν…ŒμŠ€νŠΈλŠ” 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%

이 μˆ˜μΉ˜λŠ” 맀우 μ•ˆμ •μ μ΄λ©° λ‹€μŒκ³Ό 같은 κΈ°λŠ₯을 λ³΄μ—¬μ€λ‹ˆλ‹€.

  1. μ›μ‹œ μ†ŒμΌ“ μ½κΈ°λŠ” λΉ λ¦…λ‹ˆλ‹€.
  2. GoλŠ” μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ μ•½ 80%μž…λ‹ˆλ‹€.
  3. urllib3은 μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ μ•½ 20%μž…λ‹ˆλ‹€.
  4. μš”μ²­μ€ urllib3보닀 μ•½κ°„ λŠλ¦½λ‹ˆλ‹€. μ΄λŠ” 데이터가 톡과할 λͺ‡ 개의 μŠ€νƒ ν”„λ ˆμž„μ„ μΆ”κ°€ν•˜κΈ° λ•Œλ¬Έμ— μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.
  5. httplibλŠ” requests/urllib3보닀 λŠλ¦½λ‹ˆλ‹€. 그것은 λΆˆκ°€λŠ₯ν•˜λ©° httplibκ°€ μ•„λ‹Œ λ°©μ‹μœΌλ‘œ httplib λ˜λŠ” μ†ŒμΌ“ 라이브러리λ₯Ό ꡬ성해야 ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

FWIW, 방금 @kevinburke μ—μ„œ buffering=True λ₯Ό μΆ”κ°€ν•˜μ—¬ λ³‘ν•©ν–ˆμŠ΅λ‹ˆλ‹€. μ‹€ν–‰ν•˜μ„Έμš”.
그것을 포함?

2014λ…„ 12μ›” 5일 κΈˆμš”μΌ μ˜€ν›„ 12:04:40 Cory Benfield [email protected]
썼닀:

μ’‹μ•„, μ•„λž˜ λ°μ΄ν„°λŠ” λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” κΈ°κ³„μ—μ„œ κ°€μ Έμ˜¨ κ²ƒμž…λ‹ˆλ‹€.
ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰ ν…ŒμŠ€νŠΈλŠ” Python -u ν”Œλž˜κ·Έλ‘œ μ‹€ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ„€μ •ν•˜κ³  ν”Œλž˜κ·Έκ°€ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

파이썬 2.7.6
go 버전 go1.2.1 linux/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%
벀치 GO HTTP
8GiB 0:00:21 [ 385MiB/s] [================================>] 100%

파이썬 2.7.6
go 버전 go1.2.1 linux/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%
벀치 GO HTTP
8GiB 0:00:20 [ 391MiB/s] [================================>] 100%

파이썬 2.7.6
go 버전 go1.2.1 linux/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%
벀치 GO HTTP
8GiB 0:00:21 [ 389MiB/s] [================================>] 100%

이 μˆ˜μΉ˜λŠ” 맀우 μ•ˆμ •μ μ΄λ©° λ‹€μŒκ³Ό 같은 κΈ°λŠ₯을 λ³΄μ—¬μ€λ‹ˆλ‹€.

  1. μ›μ‹œ μ†ŒμΌ“ μ½κΈ°λŠ” λΉ λ¦…λ‹ˆλ‹€.
  2. GoλŠ” μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ μ•½ 80%μž…λ‹ˆλ‹€.
  3. urllib3은 μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ μ•½ 20%μž…λ‹ˆλ‹€.
  4. μš”μ²­μ€ urllib3보닀 μ•½κ°„ λŠλ¦½λ‹ˆλ‹€.
    데이터가 톡과할 λͺ‡ 개의 μŠ€νƒ ν”„λ ˆμž„μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
  5. 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 | 20λ°€λ¦¬μ΄ˆ.com

2014λ…„ 12μ›” 5일 κΈˆμš”μΌ μ˜€μ „ 10:04 Cory Benfield μ•Œλ¦Ό @github.com
썼닀:

μ’‹μ•„, μ•„λž˜ λ°μ΄ν„°λŠ” λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” κΈ°κ³„μ—μ„œ κ°€μ Έμ˜¨ κ²ƒμž…λ‹ˆλ‹€.
ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰ ν…ŒμŠ€νŠΈλŠ” Python -u ν”Œλž˜κ·Έλ‘œ μ‹€ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ„€μ •ν•˜κ³  ν”Œλž˜κ·Έκ°€ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

파이썬 2.7.6
go 버전 go1.2.1 linux/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%
벀치 GO HTTP
8GiB 0:00:21 [ 385MiB/s] [================================>] 100%

파이썬 2.7.6
go 버전 go1.2.1 linux/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%
벀치 GO HTTP
8GiB 0:00:20 [ 391MiB/s] [================================>] 100%

파이썬 2.7.6
go 버전 go1.2.1 linux/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%
벀치 GO HTTP
8GiB 0:00:21 [ 389MiB/s] [================================>] 100%

이 μˆ˜μΉ˜λŠ” 맀우 μ•ˆμ •μ μ΄λ©° λ‹€μŒκ³Ό 같은 κΈ°λŠ₯을 λ³΄μ—¬μ€λ‹ˆλ‹€.

  1. μ›μ‹œ μ†ŒμΌ“ μ½κΈ°λŠ” λΉ λ¦…λ‹ˆλ‹€.
  2. GoλŠ” μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ μ•½ 80%μž…λ‹ˆλ‹€.
  3. urllib3은 μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ μ•½ 20%μž…λ‹ˆλ‹€.
  4. μš”μ²­μ€ urllib3보닀 μ•½κ°„ λŠλ¦½λ‹ˆλ‹€.
    데이터가 톡과할 λͺ‡ 개의 μŠ€νƒ ν”„λ ˆμž„μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
  5. 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%
  1. μ›μ‹œ μ†ŒμΌ“ μ½κΈ°λŠ” λΉ λ¦…λ‹ˆλ‹€.
  2. GoλŠ” μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ μ•½ 80%μž…λ‹ˆλ‹€.
  3. httplibλŠ” μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ 25% λ―Έλ§Œμž…λ‹ˆλ‹€.
  4. urllib3은 μ›μ‹œ μ†ŒμΌ“ 읽기 μ†λ„μ˜ μ•½ 20%이며 httplib에 μ•½κ°„μ˜ μ˜€λ²„ν—€λ“œκ°€ μΆ”κ°€λ©λ‹ˆλ‹€.
  5. μš”μ²­μ€ urllib3보닀 μ•½κ°„ λŠλ¦½λ‹ˆλ‹€. μ΄λŠ” 데이터가 톡과할 λͺ‡ 개의 μŠ€νƒ ν”„λ ˆμž„μ„ μΆ”κ°€ν•˜κΈ° λ•Œλ¬Έμ— μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ μ—¬κΈ°μ—μ„œ μ‹€μ œ λΉ„μš©μ€ 틀림없이 httplibμž…λ‹ˆλ‹€. 속도λ₯Ό 높이렀면 httplibλ₯Ό μ œκ±°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚˜λŠ” httplib의 μ–΄λ–€ 뢀뢄이 μš°λ¦¬μ—κ²Œ λΉ„μš©μ„ λ°œμƒμ‹œν‚€λŠ”μ§€ μ•Œμ•„λ‚΄κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. bench_httplib.py ν”„λ‘œνŒŒμΌλ§ν•˜λŠ” 것이 쒋은 λ‹€μŒ 단계라고 μƒκ°ν•©λ‹ˆλ‹€.

bench_socket.py ν…ŒμŠ€νŠΈμ— ν•΄λ‹Ή 쀄을 μΆ”κ°€ν•˜μ—¬ socket.makefile λ₯Ό 톡해 μ†ŒμΌ“μ„ 파일 개체둜 λ³€ν™˜ν•˜λŠ” 것을 λ°°μ œν–ˆμ§€λ§Œ μ „ν˜€ 속도가 λŠλ €μ§€μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ΄μƒν•˜κ²Œλ„ 속도가 λΉ¨λΌμ§€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λŒ€λ‹΅μ€ 거의 ν™•μ‹€ν•˜κ²Œ 전솑 인코딩: 청크 μ²˜λ¦¬μž…λ‹ˆλ‹€.
μ°Έμ‘°: https://github.com/alex/http-client-bench/pull/6 , μ „ν™˜
μ„œλ²„μ˜ Content-LengthλŠ” 예기치 μ•Šμ€ κ²°κ³Όλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

2014λ…„ 12μ›” 5일 κΈˆμš”μΌ μ˜€ν›„ 12:24:53 Cory Benfield [email protected]
썼닀:

λ”°λΌμ„œ μ—¬κΈ°μ—μ„œ μ‹€μ œ λΉ„μš©μ€ 틀림없이 httplibμž…λ‹ˆλ‹€. 이λ₯Ό κ°€μ†ν™”ν•˜λ €λ©΄ λ‹€μŒμ΄ ν•„μš”ν•©λ‹ˆλ‹€.
httplibλ₯Ό λ°©ν•΄ν•˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.

λ‚˜λŠ” httplib의 μ–΄λ–€ 뢀뢄이 μš°λ¦¬μ—κ²Œ λΉ„μš©μ„ λ°œμƒμ‹œν‚€λŠ”μ§€ μ•Œμ•„λ‚΄κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. NS
bench_httplib.pyλ₯Ό ν”„λ‘œνŒŒμΌλ§ν•˜λŠ” 것이 쒋은 λ‹€μŒ 단계라고 μƒκ°ν•˜μ‹­μ‹œμ˜€.

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65831653
.

ν₯미둜운.

청크 μ²˜λ¦¬λŠ” 거의 ν™•μ‹€νžˆ 문제이며, 특히 청크가 go의 κΈ°λ³Έ HTTP λͺ¨λ“œμ΄κΈ° λ•Œλ¬Έμ— goκ°€ 더 잘 μ²˜λ¦¬ν•œλ‹€λŠ” 사싀에 그닀지 λ†€λžμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ›μ‹œ μ†ŒμΌ“λ³΄λ‹€ λΉ λ₯Έ μš”μ²­μ€...예기치 μ•ŠμŠ΅λ‹ˆλ‹€!

μ£Όλͺ©ν•  κ°€μΉ˜κ°€ μžˆλŠ” ν•œ 가지: μ†ŒμΌ“μ΄ 이전 ν…ŒμŠ€νŠΈμ—μ„œ 청크 인코딩을 λ””μ½”λ”©ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ μ‹€μ œλ‘œ λ‹€λ₯Έ 방법보닀 더 적은 데이터λ₯Ό 읽기 λ•Œλ¬Έμ— λΆˆκ³΅μ •ν•œ 이점을 μ–»μ—ˆμŠ΅λ‹ˆλ‹€! 그듀은 λͺ¨λ‘ 청크 헀더와 8GB의 데이터λ₯Ό 읽고 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

이것은 후속 질문으둜 μ΄μ–΄μ§‘λ‹ˆλ‹€. μš°λ¦¬λŠ” μ—¬μ „νžˆ μ΄λŸ¬ν•œ λͺ¨λ“  방법이 μ‹€μ œλ‘œ λ™μΌν•œ μ–‘μ˜ 데이터λ₯Ό 읽고 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆκΉŒ?

예, μ†ŒμΌ“ λ ˆμ΄μ–΄κ°€ λΆ€μ • ν–‰μœ„λ₯Ό ν–ˆκ³  청크된 메타데이터λ₯Ό λ””μ½”λ”©ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
기술적으둜 쑰금 덜 μ½μŠ΅λ‹ˆλ‹€. 그것은 "μ–Όλ§ˆλ‚˜ 빨리
μš°λ¦¬κ°€ 읽을 수 μžˆμŠ΅λ‹ˆκΉŒ?", 아무것도 증λͺ…ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€.

2014λ…„ 12μ›” 5일 κΈˆμš”μΌ μ˜€ν›„ 12:33:10 Cory Benfield [email protected]
썼닀:

ν₯미둜운.

청크 μ²˜λ¦¬λŠ” 거의 ν™•μ‹€νžˆ 문제이며 λ‚˜λŠ” μ‹€μ œλ‘œ
특히 청크가 κΈ°λ³Έκ°’μ΄λ―€λ‘œ goκ°€ 더 잘 μ²˜λ¦¬ν•œλ‹€λŠ” 사싀에 λ†€λžμŠ΅λ‹ˆλ‹€.
이동을 μœ„ν•œ HTTP λͺ¨λ“œ.

κ·ΈλŸ¬λ‚˜ μ›μ‹œ μ†ŒμΌ“λ³΄λ‹€ λΉ λ₯Έ μš”μ²­μ€...예기치 μ•ŠμŠ΅λ‹ˆλ‹€!

μ£Όλͺ©ν•  κ°€μΉ˜κ°€ μžˆλŠ” ν•œ 가지: μ†ŒμΌ“μ΄ 청크 인코딩을 λ””μ½”λ”©ν•˜μ§€ μ•ŠλŠ” 경우
이전 ν…ŒμŠ€νŠΈμ—μ„œ μ‹€μ œλ‘œλŠ” λΆˆκ³΅μ •ν•œ 이점을 μ–»μ—ˆμŠ΅λ‹ˆλ‹€.
λ‹€λ₯Έ 방법보닀 적은 데이터λ₯Ό μ½μŠ΅λ‹ˆλ‹€! 그듀은 λͺ¨λ‘ 읽고 μžˆμ—ˆλ‹€
청크 헀더와 8GB 데이터.

이것은 후속 질문으둜 μ΄μ–΄μ§‘λ‹ˆλ‹€. μš°λ¦¬λŠ” μ—¬μ „νžˆ μ΄λŸ¬ν•œ λͺ¨λ“  방법을 μƒκ°ν•©λ‹ˆκΉŒ?
μ‹€μ œλ‘œ 같은 μ–‘μ˜ 데이터λ₯Ό 읽고 μžˆμŠ΅λ‹ˆκΉŒ?

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/2371#issuecomment -65833299
.

이것이 μš°λ¦¬κ°€ ν•œ λ²ˆμ— μ†ŒμΌ“μ—μ„œ μ½λŠ” 청크 크기와 관련이 μžˆλ‹€κ³  해도 놀라지 μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

도움이 많이 된 @alexλ₯Ό μœ„ν•œ 케이크 :cake:

@nelhage λŠ” λ‹€μ–‘ν•œ 예제λ₯Ό μΆ”μ ν–ˆμŠ΅λ‹ˆλ‹€(μ „μ†‘μ—μ„œ
인코딩: 청크 μΌ€μ΄μŠ€) https://gist.github.com/nelhage/dd6490fbc5cfb815f762
κ²°κ³Όμž…λ‹ˆλ‹€. httplib에 버그가 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
항상 μ†ŒμΌ“μ—μ„œ 전체 청크λ₯Ό μ½λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

2014λ…„ 12μ›” 8일 μ›”μš”μΌ μ˜€μ „ 9:05:14 Kenneth Reitz [email protected]
썼닀:

@alexλ₯Ό μœ„ν•œ 케이크 https://github.com/alex 맀우 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€ [이미지:
:케이크:]

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/2371#issuecomment -66147998
.

κ·Έλž˜μ„œ μš°λ¦¬κ°€ 여기에 μžˆλŠ” 것은 아무도 μ‹€μ œλ‘œ μœ μ§€ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” ν‘œμ€€ 라이브러리의 λ²„κ·Έμž…λ‹ˆκΉŒ? ( @Lukasa μ—λŠ” 1λ…„ 이상 μ—΄λ¦° 패치 μ„ΈνŠΈκ°€ 2개 이상 μžˆμŠ΅λ‹ˆλ‹€.) 였늘 λ°€ μ–΄λ”˜κ°€μ—μ„œ λͺ©λ‘μ— μ•…μ·¨λ₯Ό 올릴 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λˆ„κ΅°κ°€ (λ‚˜λŠ” 그것을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€, λΆˆλΆ„λͺ…) μ•„λ§ˆλ„ pdb둜 λ“œλ¦΄ λ‹€μš΄ν•΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€
λ˜λŠ” 무언가λ₯Ό λ§Œλ“€κ³  μ •ν™•ν•œ μ½”λ“œκ°€ 20λ°”μ΄νŠΈλ₯Ό μƒμ„±ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄μ‹­μ‹œμ˜€.
쒋은 버그 λ³΄κ³ μ„œλ₯Ό μž‘μ„±ν•  수 μžˆλ„λ‘ μ½μŠ΅λ‹ˆλ‹€.

2014λ…„ 12μ›” 8일 μ›”μš”μΌ μ˜€μ „ 9:14:09 Ian Cordasco [email protected]
썼닀:

κ·Έλž˜μ„œ μš°λ¦¬κ°€ 여기에 μžˆλŠ” 것은 ν‘œμ€€ 라이브러리의 λ²„κ·Έμž…λ‹ˆλ‹€.
μœ μ§€? ( @Lukasa https://github.com/Lukasa μ—λŠ” μ΅œμ†Œ 2개의 νŒ¨μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.
1λ…„ 이상 μ—΄λ¦° μ„ΈνŠΈ
였늘 λ°€ μ–΄λ”˜κ°€

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/2371#issuecomment -66149522
.

였늘 λ°€μ΄λ‚˜ 내일 아무도 μ•ˆ 였면 λ§žμΆ”λ„λ‘ λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ·Όλ³Έ 원인에 λŒ€ν•œ μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ? 이 짧은 읽기λ₯Ό μƒμ„±ν•˜λŠ” 것은 무엇이며, 그것듀이 μ—†μœΌλ©΄ 상황이 μ–Όλ§ˆλ‚˜ κ°œμ„ λ©λ‹ˆκΉŒ?

@kislyuk λ‚΄κ°€ μ•„λŠ” ν•œ

@루카사 κ°μ‚¬ν•©λ‹ˆλ‹€. 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

이 νŒ¨ν„΄μ€ λ‹€μŒκ³Ό 같이 μ„€λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • self.fp.readline(라인 591)은 8192λ°”μ΄νŠΈ(socket.readlineμ—μ„œ)에 λŒ€ν•΄ λ²„νΌλ§λœ 읽기λ₯Ό νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€.
  • μ†ŒλΉ„λ˜λŠ” 각 μ²­ν¬λŠ” 1031λ°”μ΄νŠΈ(5λ°”μ΄νŠΈ 청크 길이("400\r\n") + 1024λ°”μ΄νŠΈ 데이터 + 2λ°”μ΄νŠΈ 터미넀이터)μž…λ‹ˆλ‹€.
  • λ²„νΌλ§λœ 8192λ°”μ΄νŠΈμ—μ„œ 7개의 청크λ₯Ό μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ 975λ°”μ΄νŠΈκ°€ λ‚¨μŠ΅λ‹ˆλ‹€.
  • 그런 λ‹€μŒ 970λ°”μ΄νŠΈλ₯Ό λ‚¨κΈ°λŠ” λ‹€μŒ 청크 길이(5λ°”μ΄νŠΈ)λ₯Ό μ½μŠ΅λ‹ˆλ‹€.
  • 이제 ν˜„μž¬ 청크(1024)λ₯Ό μΆ©μ‘±ν•˜κΈ°μ— λΆˆμΆ©λΆ„ν•œ 970λ°”μ΄νŠΈλ§Œ μžˆμœΌλ―€λ‘œ 54λ°”μ΄νŠΈμ˜ 뢀쑱뢄에 λŒ€ν•΄ λ„€νŠΈμ›Œν¬λ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.
  • 이 httplibλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ λ―Έν•΄κ²° λ°”μ΄νŠΈμ— λŒ€ν•΄ sock.read(54)λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. 이 경우 socket.read(λͺ…μ‹œμ  길이)λŠ” μ§€μ •λœ 54λ°”μ΄νŠΈ(λ‹€λ₯Έ 8192λ₯Ό λ²„νΌλ§ν•˜λŠ” λŒ€μ‹ )에 λŒ€ν•΄ λ„€νŠΈμ›Œν¬λ‘œ μ΄λ™ν•˜λ„λ‘ μ„ νƒν•©λ‹ˆλ‹€.
  • 그런 λ‹€μŒ 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λ°”μ΄νŠΈ 읽기와 κ΄€λ ¨ν•˜μ—¬ λ²„νΌλ§λœ μ†ŒμΌ“μ΄ λΉ„μ–΄ μžˆμ§€ μ•ŠμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

이에 λ”ν•˜μ—¬. μž‘μ€ 읽기가 μ²˜λ¦¬λŸ‰ μ†μ‹€μ˜ μ£Όμš” μš”μΈμΈμ§€(λ˜λŠ” localhostκ°€ μ•„λ‹Œ) ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 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도 ν•΄κ²°ν•΄μ•Ό ν•  ν›Œλ₯­ν•œ λͺ©ν‘œμΈ 것 κ°™μŠ΅λ‹ˆλ‹€.

@ μ•Œλ ‰μŠ€ - λ‚˜λŠ” 당신이 μ–ΈκΈ‰ ν•œ λΉ„ 청크 μ„±λŠ₯ 문제 μš”μ²­μ— λŒ€ urllib3으둜 쑰금 μ£Όμœ„ λ†€μ•˜λ‹€. λΉ„μŠ·ν•œ μš”μ²­μ΄ 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 κ°€ 본질적으둜 μž‘μ€ 읽기λ₯Ό λ°©μ§€ν•˜μ—¬ λ§Žμ€ λΉ„νš¨μœ¨μ„±μ„ ν•΄κ²°ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. io.BufferedReader κ΄‘λ²”μœ„ν•˜κ²Œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— Py3의 httplib 에 이 λ¬Έμ œκ°€ μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. μ΄λŠ” BufferedSocket 와 거의 λ™μΌν•œ μ’…λ₯˜μ˜ 이점을 μ œκ³΅ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ hyper HTTP/1.1 κΈ°λŠ₯을 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  만큼 μ„±μž₯ν•˜λ©΄ μ΄λŸ¬ν•œ λ‹€λ₯Έ κ΅¬ν˜„κ³Ό ν•¨κ»˜ λ²€μΉ˜λ§ˆν‚Ήν•˜κ³  hyper μ΅œλŒ€ν•œ 빨리 λ§Œλ“€κΈ° μœ„ν•΄ λ…Έλ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

거의 1λ…„ λ™μ•ˆ λΉ„ν™œμ„± μƒνƒœμž…λ‹ˆλ‹€. 폐쇄.

λ‚˜λŠ” 10 λ°° 덜 μ‚¬μš©ν•˜μ—¬ requests 에 λΉ„ν•΄ urllib3 .

λ¬Έμ œκ°€ urllib3의 HTTPResponse 클래슀 내에 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. iterator둜 읽을 λ•Œ μ²˜λ¦¬λŸ‰μ€ 정말 λ‚˜μ©λ‹ˆλ‹€. λ‚΄ μ½”λ“œκ°€ 맀우 μΆ”μ•…ν•œ ν•΄ν‚ΉμœΌλ‘œ μž‘λ™ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. urllib3μ—μ„œ μ‚¬μš©ν•˜λŠ” 밑쀄이 그어진 httplib.HTTPResponse 개체λ₯Ό λ°˜ν™˜ν•˜κ³  μ²˜λ¦¬λŸ‰ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

ν₯미둜운 사싀: urllib3의 HTTPResponse μŠˆνΌν΄λž˜μŠ€λŠ” io.IOBase μž…λ‹ˆλ‹€. Python3의 httplib.HTTPResponse μŠˆνΌν΄λž˜μŠ€λŠ” io.BufferedIOBase μž…λ‹ˆλ‹€. 이와 관련이 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰