Requests: рд╕рдВрднрд╡ рдореЗрдореЛрд░реА рд▓реАрдХ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдЕрдХреНрддреВре░ 2013  ┬╖  53рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: psf/requests

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдПрдХ рдЖрдИрдкреА рдХреИрдорд░рд╛ рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдХрд╛рдо рд╕реЗрдЯ рдПрдХрд░рд╕рддрд╛ рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред

import requests
from memory_profiler import profile


<strong i="6">@profile</strong>
def lol():
    print "sending request"
    r = requests.get('http://cachefly.cachefly.net/10mb.test')
    print "reading.."
    with open("test.dat", "wb") as f:
        f.write(r.content)
    print "Finished..."

if __name__=="__main__":
    for i in xrange(100):
        print "Iteration", i
        lol()

рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирдореВрдирд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред
* Iteration 0 *

Iteration 0
sending request
reading..
Finished...
Filename: test.py

Line #    Mem usage    Increment   Line Contents
================================================
     5     12.5 MiB      0.0 MiB   <strong i="12">@profile</strong>
     6                             def lol():
     7     12.5 MiB      0.0 MiB       print "sending request"
     8     35.6 MiB     23.1 MiB       r = requests.get('http://cachefly.cachefly.net/10mb.test')
     9     35.6 MiB      0.0 MiB       print "reading.."
    10     35.6 MiB      0.0 MiB       with open("test.dat", "wb") as f:
    11     35.6 MiB      0.0 MiB        f.write(r.content)
    12     35.6 MiB      0.0 MiB       print "Finished..."

* Iteration 1 *

Iteration 1
sending request
reading..
Finished...
Filename: test.py

Line #    Mem usage    Increment   Line Contents
================================================
     5     35.6 MiB      0.0 MiB   <strong i="17">@profile</strong>
     6                             def lol():
     7     35.6 MiB      0.0 MiB       print "sending request"
     8     36.3 MiB      0.7 MiB       r = requests.get('http://cachefly.cachefly.net/10mb.test')
     9     36.3 MiB      0.0 MiB       print "reading.."
    10     36.3 MiB      0.0 MiB       with open("test.dat", "wb") as f:
    11     36.3 MiB      0.0 MiB        f.write(r.content)
    12     36.3 MiB      0.0 MiB       print "Finished..."

рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рд╣рд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрдврд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ requests.get рдЕрдкрд░рд╛рдзреА рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

** Iteration 99 ** рд╕реЗ рдпрд╣ рдореЗрдореЛрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

Iteration 99
sending request
reading..
Finished...
Filename: test.py

Line #    Mem usage    Increment   Line Contents
================================================
     5     40.7 MiB      0.0 MiB   <strong i="23">@profile</strong>
     6                             def lol():
     7     40.7 MiB      0.0 MiB       print "sending request"
     8     40.7 MiB      0.0 MiB       r = requests.get('http://cachefly.cachefly.net/10mb.test')
     9     40.7 MiB      0.0 MiB       print "reading.."
    10     40.7 MiB      0.0 MiB       with open("test.dat", "wb") as f:
    11     40.7 MiB      0.0 MiB        f.write(r.content)
    12     40.7 MiB      0.0 MiB       print "Finished..."

рдЬрдм рддрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдмрдЧ рд╣реИ рдпрд╛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рддреНрд░реБрдЯрд┐ рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреА рдХреЛрдИ рдФрд░ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдкрд░ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реВрдВ

рд╕рднреА 53 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕реЗ рдмрдврд╝рд╛рдиреЗ рдФрд░ рдЗрддрдирд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рдмрддрд╛рдУ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХрднреА рднреА рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдиреАрдЪреЗ рдЬрд╛рддрд╛ рд╣реИ?

рдореИрдВрдиреЗ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рдиреАрдЪреЗ рдЬрд╛рддреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдкрд╛рдпрдерди рдХреЗ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рдХрд┐рдХ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рдмрд╛рдж gc.collect() рдХреЙрд▓ рдЬреЛрдбрд╝рд╛ред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рд╛ред

рдХреНрдпрд╛ рдореИрдВ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдХреНрдпреЛрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдореЗрд░реА рдХрдВрдкрдиреА рдиреЗ рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ pypy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣рдордиреЗ рдкрд╛рдпрдерди-рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрдИ рджрд┐рди рдмрд┐рддрд╛рдПред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдЧрдВрднреАрд░рддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдПрдХ рдореЗрдореЛрд░реА рдкреНрд░реЙрдЗрд▓рд░ рдХреЛ рдЪрд▓рд╛рддреЗ рд╕рдордп рд╣рдорд╛рд░реА рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ:
http://cl.ly/image/3X3G2y3Y191h

рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рд╢рд╛рдпрдж, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕реНрдерд╛рдпреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЧрдВрднреАрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрджред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣рддрд╛рд╢ рд╣реИрдВред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЗрд╕рдХреА рдХрднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПрдЧреАред рдЕрдиреНрдпрдерд╛, рдореИрдВ рд░рд╛рдп рд░рдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдорд┐рд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдЬреИрд╕реЗ: рд╕реНрд╡рд╛рд╕реНрдереНрдп рджреЗрдЦрднрд╛рд▓ рд╕рдВрдмрдВрдзреА рд╕реЗрд╡рд╛рдУрдВ) рдХреЗ рд▓рд┐рдП рдЕрдЬрдЧрд░-рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЦрддрд░рдирд╛рдХ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж,
-рдореИрдЯ

рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╣рдореЗрдВ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд┐рджрд╛рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЦреБрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЦреИрд░, рдореБрдЭреЗ рддрдм рдорджрдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдкрд░реАрдХреНрд╖рд╛ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ git рд░реЗрдкреЛ рдмрдирд╛рдПред
https://github.com/mhjohnson/memory-profiling-requests

рдпрд╣рд╛рдБ рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:
http://cl.ly/image/453h1y3a2p1r

рдЙрдореНрдореАрдж рд╣реИ рдХреА рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛! рдЕрдЧрд░ рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

-рдореИрдЯ

рдзрдиреНрдпрд╡рд╛рдж рдореИрдЯ! рдореИрдВ рдЕрдм рдЗрд╕ рдкрд░ рдЧреМрд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдИ рд╣реИ, (рдФрд░ рдореИрдВрдиреЗ рдЬреЛ рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдБ рдЖрдЬрдорд╛рдИ рд╣реИрдВ) рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдореБрдЭреЗ рдЕрдм рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИред

рддреЛ рдпрд╣ рд▓рдЧрднрдЧ 0.1MB / рдЕрдиреБрд░реЛрдз рдкрд░ рдмрдврд╝рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ profile рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЪрд┐рдкрдХрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ 0.1 рд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рд╕рдордЧреНрд░ рдЙрдкрдпреЛрдЧ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдкреНрд░рддрд┐- рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧред рдХреНрдпрд╛ рдорд┐рддрд▓реА рд╕реЗ рдмреЗрд╣рддрд░ рдЙрдкрдХрд░рдг рд╣реИрдВ?

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкрд╛рдЗрдк рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ | ag '.*0\.[1-9]+ MiB.*' рд╣реИ рдЬрд╣рд╛рдВ рдореЗрдореЛрд░реА рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ рдФрд░ profile рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ Session#send рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ HTTPAdapter#send рдХреЙрд▓ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИред рдЦрд░рдЧреЛрд╢ рдХреЗ рдЫреЗрдж рдХреЗ рдиреАрдЪреЗ рдореИрдВ рдЬрд╛рддрд╛ рд╣реВрдВ

рдФрд░ рдЕрдм рдпрд╣ рд╕рдм L355 рдкрд░ conn.urlopen рдХреЙрд▓ рдФрд░ HTTPAdapter#get_connection рдХреЙрд▓ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдк get_connection рд╕рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ PoolManager#connection_from_url рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдпрд╣ 7 рдмрд╛рд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рдмрд╣реБрдордд рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП HTTPResponse urllib3 рд╕реЗ рд▓реМрдЯрд╛рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ _should_ рдЙрдирдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореЗрдореЛрд░реА рдлреИрдХреНрдЯ рдХреЗ рдмрд╛рдж рд░рд┐рд▓реАрдЬрд╝ рд╣реБрдИ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдореИрдВ urllib3 рдореЗрдВ рдЦреБрджрд╛рдИ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред

@ рд╕рд┐рдЧрдорд╛рд╡рд╛рдпрд░рд╕ 24 рд╡рд╛рд╣ред рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдп! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЧрд░реНрдо рд╕реНрдерд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рд╡рд╕реНрддреБ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЖрдк

import gc
import objgraph
# garbage collect first
gc.collect()  
# print most common python types
objgraph.show_most_common_types()

Lemme рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

-рдореИрдЯ

рдЕрдкрд░рд╛рдзреА рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрдорд╛рди рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ PyPy рдкрд░ рдмрджрддрд░ рдХреНрдпреЛрдВ рд╣реИ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ ...

рдореИрдВ рдЕрднреА рдПрдХ рд╣рд╡рд╛рдИ рдЕрдбреНрдбреЗ рдкрд░ рдмреИрдард╛ рд╣реВрдВ рдФрд░ рдЬрд▓реНрдж рд╣реА рдХрдИ рдШрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрджрд╛рди рдкрд░ рд░рд╣реВрдВрдЧрд╛ред рдореИрдВ рд╢рд╛рдпрдж рдЖрдЬ рд░рд╛рдд рдпрд╛ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рддрдХ (рдпрджрд┐ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ / рд╕рдкреНрддрд╛рд╣ рддрдХ рдирд╣реАрдВ) рддрдХ рдирд╣реАрдВ рдЬрд╛ рдкрд╛рдКрдБрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рддрдХ, рдореИрдВрдиреЗ release_conn HTTPResponse рд╣рдо рд╡рд╛рдкрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ gc.get_referents рд╕рд╛рде рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрдпрд╛ GC'd рд╣реЛрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдореВрд▓ рдХреИрдВрдкрдкреНрд▓рд┐рдм HTTPResponse ( _original_response рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдФрд░ рдЬреЛ get_referents рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдИрдореЗрд▓ рд╕рдВрджреЗрд╢ (рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП) рдФрд░ рдмрд╛рдХреА рд╕рдм рдпрд╛ рддреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рд╢рдмреНрджрдХреЛрд╢ (рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рд╕реВрдЪреА)ред рдпрджрд┐ рдпрд╣ рд╕реЙрдХреЗрдЯреНрд╕ рд╣реИ, рддреЛ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╡реЗ рдХрд╣рд╛рдВ рд╕реЗ рдХрдЪрд░рд╛ рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Session#close (рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдЙрдкрдпреЛрдЧ рд╕рддреНрд░ рдмрдирд╛рдпрд╛) рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдЗрд╕рд╕реЗ рдкреВрд▓рдореИрди рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ)ред рддреЛ рджреВрд╕рд░реА рдмрд╛рдд рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдк рдереА, рд╡рд╣ рдпрд╣ рдереА рдХрд┐ PoolManager#connection_from_url ~ 0.8 MB (рджреЗ рдпрд╛ 0.1 рд▓реЗрдВ) рдХреЛ рдкрд╣рд▓реЗ рдХреБрдЫ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЗрд╕ рддрд░рд╣ ~ 3MB рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕рд╛ conn.urlopen HTTPAdapter#send ред рд╡рд┐рдЪрд┐рддреНрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк gc.set_debug(gc.DEBUG_LEAK) рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ gc.garbage рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╖рдо рддрддреНрд╡ рд╣реИрдВред рдпрд╣ [[[...], [...], [...], None], [[...], [...], [...], None], [[...], [...], [...], None], [[...], [...], [...], None]] рддрд░рд╣ рдХреБрдЫ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк gc.garbage[0] is gc.garbage[0][0] рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдмрд┐рд▓реНрдХреБрд▓ рдмреЗрдХрд╛рд░ рд╣реЛред рдореМрдХрд╛ рдорд┐рд▓рдиреЗ рдкрд░ рдореБрдЭреЗ рдУрдмреНрдЬреИрдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ urllib3 рдореЗрдВ рдЦреБрджрд╛рдИ рдХреА рдФрд░ рдЖрдЬ рд╕реБрдмрд╣ рдкрд╣рд▓реЗ рдЦрд░рдЧреЛрд╢ рдХреЗ рдЫреЗрдж рдХрд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ ConnectionPool#urlopen рдкреНрд░реЛрдлрд╛рдЗрд▓ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ ConnectionPool#_make_request ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, urllib3/connectionpool.py рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ 306 рдФрд░ 333 рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдмрд╣реБрдд рд╕реА рдореЗрдореЛрд░реА рд╣реИред L306 self._validate_conn(conn) рдФрд░ L333 conn.getresponse(buffering=True) ред getresponse HTTPConnection рдкрд░ httplib рд╡рд┐рдзрд┐ рд╣реИред рдЙрд╕ рдореЗрдВ рдЖрдЧреЗ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рд╣рдо _validate_conn рд▓рд╛рдЗрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рддреЛ рдпрд╣ conn.connect() рдЬреЛ рдПрдХ рдФрд░ HTTPConnor рд╡рд┐рдзрд┐ рд╣реИред connect рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╣рд╛рдВ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдореЗрдореЛрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ print(old_pool) HTTPConnectionPool#close рдЪрд┐рдкрдХрд╛ рджреЗрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдХрднреА рднреА рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рддреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реА рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд▓ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рд╣реИред

рдпрд╣ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рдореИрдВ рдЖрдЬ рдФрд░ рдХрд▓ IRC рд╕реЗ рдмрд╛рд╣рд░ / рдмрд╛рд╣рд░ рд░рд╣реВрдБрдЧрд╛ред

рддреЛ рдЗрд╕реЗ рдЖрдЧреЗ рдЯреНрд░реЗрд╕ рдХрд░рддреЗ рд╣реБрдП, рдпрджрд┐ рдЖрдк python _make_request рдЕрднреА рднреА рд╕рдЬрд╛рдП рдЧрдП рд╣реИрдВ ( profile ), рдФрд░ рдЖрдк рдПрдХ рд╕рддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ 10 рдпрд╛ 20 рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ (рдореЗрдВ рд╕рдорд╛рди URL) рднреА, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЙрди рдХреЛ рдЧрд┐рд░рд╛ рд╣реБрдЖ рдорд╛рдирд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП VerifiedHTTPSConnection рдмрдВрдж рд╣реИ рдФрд░ рдлрд┐рд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ connection рд╡рд░реНрдЧ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЙрдХреЗрдЯред close рд╡рд┐рдзрд┐ рд╡рд╣ рд╣реИ рдЬреЛ httplib.HTTPConnection (L798) рдкрд░ рд░рд╣рддреА рд╣реИред рдпрд╣ рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдХреЛрдИ рднреА рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддрдм рдпрд╣ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдХреЛрдИ рднреА рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рд╕рдмрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ httplib.HTTPResponse ред рдпрджрд┐ рдЖрдк VerifiedHTTPSConnection#connect рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдмрдирд╛рдИ рдЧрдИ / рд▓реАрдХ рдХреА рдЧрдИ рд╕рднреА рдореЗрдореЛрд░реА urllib3.util.ssl_.ssl_wrap_socket ред

рддреЛ рдЗрд╕рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬреЛ рдореИрдореЛрд░реА_рдкреНрд░рдлрд╛рдЗрд▓рд░ рдореИрдореЛрд░реА рдпреВрд╕реЗрдЬ рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рд╣реИ 'рд░реЗрдЬрд┐рдбреЗрдВрдЯ рд╕реЗрдЯ рд╕рд╛рдЗрдЬ (рдЖрд░рдПрд╕рдПрд╕)ред рдпрд╣ RAM рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ (vms рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХрд╛ рдЖрдХрд╛рд░, рдореЙрд▓рдХреЛрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЛ рд▓реАрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рд╣рдо рд╕рд┐рд░реНрдл рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╕реНрдореГрддрд┐ рдЬреЛ рд╣рдо рдирд╣реАрдВ рдЦреЛ рд░рд╣реЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдЬрд┐рддрдиреЗ рднреА URLs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ рд╕рднреА рд╕рддреНрдпрд╛рдкрд┐рдд HTTPS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВрдиреЗ http://google.com рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдФрд░ рдЕрднреА рднреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ ~ 11-14MiB рдХрдо рдЦрдкрдд рдХрд░рддрд╛ рд╣реИ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ред рдпрд╣ рдЕрднреА рднреА рд╕рднреА conn.getresponse рд▓рд╛рдЗрди рдкрд░ рдЖрддрд╛ рд╣реИ (рдФрд░ рдЕрдм рдХреБрдЫ рд╣рдж рддрдХ, conn.request )ред

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдЙрддреНрддрд░ рдореЗрдВ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рд╡реАрдПрдордПрд╕ рдЬреНрдпрд╛рджрд╛ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЖрд░рдПрд╕рдПрд╕ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЕрднреА рддрдХ mprof рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реИред рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝рддрд╛ рд╡реАрдПрдордПрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧрд╛, рдЬрдмрдХрд┐ рдЖрд░рдПрд╕рдПрд╕ рдмрд╕ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдореЙрд▓рд╕реНрдХ (рдЬреЛ рд╕рдВрднрд╡ рд╣реИ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо (рдпрджрд┐ рдореИрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ) рддреЛ рдЖрд░рдПрд╕рдПрд╕ рдХреЛ рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рди рдХрд░реЗрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЗрдЬ рджреЛрд╖ рди рд╣реЛ рдФрд░ рдХреЛрдИ рдФрд░ рдЬрдЧрд╣ рди рд╣реЛ, рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрд░рдПрд╕рдПрд╕ рдХрднреА рдирд╣реАрдВ рд╣рдЯреЗрдЧрд╛ (рднрд▓реЗ рд╣реА рдпрд╣ рд╣реЛ рд╕рдХреЗ)ред рдХрд╣рд╛ рдХрд┐, рдЕрдЧрд░ рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдерд┐рд░ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдкрд╣реБрдВрдЪреЗ рдмрд┐рдирд╛ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЕрдиреБрд░реЛрдз / urllib3 рдпрд╛ рд╕рд┐рд░реНрдл рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рд╣реИ

рдореИрдВ рдпрд╣ рднреА рджреЗрдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рд╣рдо urllib2 / CANplib рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдпрд╣ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, Session#close рдареАрдХ рд╕реЗ рд╕рднреА рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ GC'd рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд╕рдВрджрд░реНрдн рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдПрдХ рд╕реЙрдХреЗрдЯ рдХреЛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрд╕рдПрд╕рдПрд▓рдПрд╕рдХреЗрдЯ рднреА рдареАрдХ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХрдЪрд░реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП urllib2 рд▓рдЧрд╛рддрд╛рд░ 13.3MiB рдХреЗ рдЖрд╕рдкрд╛рд╕ рдлреНрд▓реИрдЯрд▓рд╛рдЗрди рд▓рдЧрддрд╛ рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдПрдХ рдХреЛрд╢рд┐рд╢ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдерд╛ / рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж URLError рдХреЗ рд╕рд╛рде рд▓рдЧрд╛рддрд╛рд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПред рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдХреБрдЫ рд╕рдордп рдХреЗ рдмрд╛рдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

@ sigmavirus24 рдЖрдк рдЗрд╕реЗ рдХреБрдЪрд▓ рд░рд╣реЗ рд╣реИрдВ! :)

рд╣рдореНрдо ... рдкрд╛рдпрдерди рдХреЗрд╡рд▓ рдлрд┐рд░ рд╕реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддрдм рддрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдореЗрдореЛрд░реА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк 13.3MiB рдкрд░ рдЬреЛ рдлреНрд▓реИрдЯрд▓рд╛рдЗрди рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╢рд╛рдпрдж рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ urllib3 рдХреЗ рд╕рд╛рде, urllib2 рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рдореЗрдореЛрд░реА рд▓реАрдХ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ urllib3 рдореЗрдВ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЙрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк urllib2 рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ HTTPConnection рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рддреБрдо рдХрд░реЛ

import sys
import requests

s = requests.Session()
r = s.get('https://httpbin.org/get')
print('Number of response refs: ', sys.getrefcount(r) - 1)
print('Number of session refs: ', sys.getrefcount(s) - 1)
print('Number of raw refs: ', sys.getrefcount(r.raw) - 1)
print('Number of original rsponse refs: ', sys.getrefcount(r.raw._original_response) - 1)

рдкрд╣рд▓реЗ рддреАрди рдХреЛ 1 рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдЦрд┐рд░реА 3. [1] рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкрд╣рдЪрд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдПрдХ HTTPConnection рдореЗрдВ _HTTPConnection__response рдЬреЛ _original_response рд╕рдВрджрд░реНрдн рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ 3 рд╣реЛрдЧреАред рдореИрдВ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рддреАрд╕рд░реА рдкреНрд░рддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИред

рдЖрдЧреЗ рдХреЗ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ

import gc
gc.set_debug(gc.DEBUG_STATS | gc.DEBUG_UNCOLLECTABLE)

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВред рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж 2 рдЕрдЧрдореНрдп рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЕрдпреЛрдЧреНрдп рдирд╣реАрдВ рдерд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рдкрд░реАрдХреНрд╖рдг urllib3 рдХреЛ @mhjohnson, рдмрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЙрд▓ рдХреА рдЬрдЧрд╣ requests.get рдХреЗ рд╕рд╛рде urllib2.urlopen (рднреА рдореИрдВ рд╢рд╛рдпрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ r.read() , рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдерд╛)ред

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ @mjohnson рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕реБрдЭрд╛рд╡ рдХреЛ рд▓рд┐рдпрд╛ рдФрд░ objgraph рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдХрд┐ рдЕрдиреНрдп рд╕рдВрджрд░реНрдн рдХрд╣рд╛рдБ рдерд╛, рд▓реЗрдХрд┐рди objgraph рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрд╣рд╛:

objgraph.show_backrefs([r.raw._original_response], filename='requests.png')

рд╕реНрдХреНрд░рд┐рдкреНрдЯ 2 рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдКрдкрд░ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рд╛:
requests рдЬреЛ рдХреЗрд╡рд▓ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ 2 рд╕рдВрджрд░реНрдн рд╣реЛрдВрдЧреЗред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ sys.getrefcount рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред

рддреЛ рдпрд╣ рдПрдХ рд▓рд╛рд▓ рд╣реЗрд░рд┐рдВрдЧ рд╣реИред рдПрдХ urllib3.response.HTTPResponse рджреЛрдиреЛрдВ _original_response рдФрд░ _fp ред _HTTPConection__response рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣рдореЗрдВ рддреАрди рд░реЗрдлрд░реА рджреЗрддрд╛ рд╣реИред

рддреЛ, urllib3.response.HTTPResponse рдореЗрдВ _pool рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ PoolManager рджреНрд╡рд╛рд░рд╛ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, HTTPAdapter рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, Response рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдФрд░ рд╡реНрдпрдХреНрддрд┐ рдпрд╣рд╛рдВ рд╕реЗ рдХреБрдЫ рдкрд╣рдЪрд╛рди рд╕рдХреЗ:

requests

рдХреЛрдб рдЬреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╣реИ: https://gist.github.com/sigmavirus24/bc0e1fdc5f248ba1201d

@ sigmavirus24
рд╣рд╛рдБ, рдореИрдВ рдЙрд╕ рдЖрдЦрд┐рд░реА рдЧреНрд░рд╛рдлрд┐рдХ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЛ рдЧрдпрд╛ред рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореБрдЭреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рди рд╣реА рдореИрдВ рдбреАрдмрдЧрд┐рдВрдЧ рдореЗрдореЛрд░реА рд▓реАрдХ рдкрд░ рдмрд╣реБрдд рдЕрдиреБрднрд╡реА рд╣реВрдВред

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреМрди рд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдореИрдВ рдЖрдкрдХреЗ рдЧреНрд░рд╛рдлрд┐рдХ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд▓рд╛рд▓ рддреАрд░ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?
http://cl.ly/image/3l3g410p3r1C

рдореИрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдврд╝рддреА рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛
python3 рдкрд░ urllib.request.urlopen рдХреЗ рд╕рд╛рде urllib3 / request рдХреЛ рдмрджрд▓рдХрд░ред

рдпрд╣рд╛рдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХреЛрдб: https://gist.github.com/kevinburke/f99053641fab0e2252f0

рдХреЗрд╡рд┐рди рдмрд░реНрдХ
рдлреЛрди: 925.271.7005 | twentymilliseconds.com

рд╕реЛрдо, 3 рдирд╡рдВрдмрд░, 2014 рдХреЛ 9:28 рдмрдЬреЗ, рдореИрдереНрдпреВ рдЬреЙрдирд╕рди рд╕реВрдЪрдирд╛рдПрдВ @ithub.com
рд▓рд┐рдЦрд╛ рдерд╛:

@ рд╕рд┐рдЧрдорд╛рд╡рд╛рдпрд░рд╕ 24 https://github.com/sigmavirus24
рд╣рд╛рдБ, рдореИрдВ рдЙрд╕ рдЖрдЦрд┐рд░реА рдЧреНрд░рд╛рдлрд┐рдХ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЛ рдЧрдпрд╛ред рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рдирд╣реАрдВ
рдХреЛрдб рдмреЗрд╕ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ рди рд╣реА рдореИрдВ рдбреАрдмрдЧрд┐рдВрдЧ рдореЗрдореЛрд░реА рдкрд░ рдмрд╣реБрдд рдЕрдиреБрднрд╡реА рд╣реВрдВ
рд▓реАрдХред

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреМрди рд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдореИрдВ рд▓рд╛рд▓ рддреАрд░ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рдЕрдкрдиреЗ рдЧреНрд░рд╛рдлрд┐рдХ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ?
http://cl.ly/image/3l3g410p3r1C

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/kennethreitz/requests/issues/1685#issuecomment -61595362
ред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ
рдХрдиреЗрдХреНрд╢рди: рдирдЬрджреАрдХреА рд╣реЗрдбрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://api.twilio.com/2010-04-01.json)
рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░рд╛рд╢рд┐ рд╕реЗ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреИрд╡рд┐рдпрдЯ рд╣реИ
рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░рдХ рд╣реИрдВ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реЙрдХреЗрдЯ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ
рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджрд╛ред

рдХреЗрд╡рд┐рди рдмрд░реНрдХ
рдлреЛрди: 925.271.7005 | twentymilliseconds.com

рд╕реЛрдо, 3 рдирд╡рдВрдмрд░, 2014 рдХреЛ 9:43 рдмрдЬреЗ, рдХреЗрд╡рд┐рди рдмреБрд░реНрдХреЗ [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдврд╝рддреА рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛
python3 рдкрд░ urllib.request.urlopen рдХреЗ рд╕рд╛рде urllib3 / request рдХреЛ рдмрджрд▓рдХрд░ред

рдпрд╣рд╛рдБ рд╕рдВрд╢реЛрдзрд┐рдд рдХреЛрдб:
https://gist.github.com/kevinburke/f99053641fab0e2259f0

рдХреЗрд╡рд┐рди рдмрд░реНрдХ
рдлреЛрди: 925.271.7005 | twentymilliseconds.com

рд╕реЛрдо, 3 рдирд╡рдВрдмрд░, 2014 рдХреЛ 9:28 рдмрдЬреЗ, рдореИрдереНрдпреВ рдЬреЙрдирд╕рди рд╕реВрдЪрдирд╛рдПрдВ @ithub.com
рд▓рд┐рдЦрд╛ рдерд╛:

@ рд╕рд┐рдЧрдорд╛рд╡рд╛рдпрд░рд╕ 24 https://github.com/sigmavirus24
рд╣рд╛рдБ, рдореИрдВ рдЙрд╕ рдЖрдЦрд┐рд░реА рдЧреНрд░рд╛рдлрд┐рдХ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЛ рдЧрдпрд╛ред рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ
рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ рди рд╣реА рдореИрдВ рдбреАрдмрдЧрд┐рдВрдЧ рдкрд░ рдмрд╣реБрдд рдЕрдиреБрднрд╡реА рд╣реВрдВ
рд╕реНрдореНрд░рддрд┐ рд╕реЗ рд░рд┐рд╕рд╛рд╡ред

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреМрди рд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдореИрдВ рд▓рд╛рд▓ рддреАрд░ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рдЕрдкрдиреЗ рдЧреНрд░рд╛рдлрд┐рдХ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ?
http://cl.ly/image/3l3g410p3r1C

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/kennethreitz/requests/issues/1685#issuecomment -61595362
ред

@mhjohnson рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдХрд┐ metatype рдХреЗ рд╕рдиреНрджрд░реНрдн рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП type рд╕реЗ object рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЬреЛ type ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рд╕рдВрджрд░реНрдн object рдпрд╛ type , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣, рдЕрдЧрд░ рдореИрдВ рдЙрди рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЧреНрд░рд╛рдл 2 рдиреЛрдбреНрд╕ рдХреА рддрд░рд╣ рдмрди рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдореЗрдореЛрд░реА рд▓реАрдХ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рднреА рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╡реЗрдм рдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рджрд┐рдиреЛрдВ рддрдХ рдЪрд▓рддреА рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ?

@Mhohnson рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ @kevinburke рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ GC рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ PyPy рдкрд░ рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

3c0b94047c1ccfca4ac4f2fe32afef0ae314094e рдХрдорд┐рдЯрдореЗрдВрдЯ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд╛рдЗрди https://github.com/kennethreitz/requests/blob/master/requests/models.py#L736

рд╕рд╛рдордЧреНрд░реА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ self.raw.release_conn() рдХреЙрд▓ рдХрд░рдирд╛ PyPy рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЬрдЧрд╣ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╕рддреНрд░ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд .close() рдХреЙрд▓ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ @ sigmavirus24 рджреНрд╡рд╛рд░рд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХреНрдпреВрдП рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдкреНрд░рд╢реНрди рдФрд░ рдПрдХ рд╕реБрдЭрд╛рд╡ рднреА рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рд╕реЗ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ? рд╕реАрдЖрдИ рд╣реЛрдиреЗ рд╕реЗ рд╣рдореЗрдВ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреА, рдЬрд╣рд╛рдБ рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░рджрд░реНрд╢рди / рдореЗрдореЛрд░реА рд░рд┐рдЧреНрд░реЗрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг pq рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
https://github.com/malthe/pq/blob/master/pq/tests.py#L287

рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдкрд░ рдХреВрдж рдХрд░ рдорджрдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛!
рд╣рдо рдРрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд░рд╣реЗрдВрдЧреЗред

@stas рдореИрдВ рдПрдХ рдмрд╛рдд рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

рдЕрдиреБрд░реЛрдз рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

PyPy рдХреЛ рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рдХрд░, рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ _need_ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ CPython рдореЗрдВ рдкрд╣реБрдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдСрдЯреЛ gc'd рдорд┐рд▓реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдмрдВрдж рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рди рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИред

рд╣рдо рдПрдХ CI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд╕рдордп рдЕрд╕реНрд╡рд╕реНрде рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ @kennethreitz рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИред рдЬрдм рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╕рдордп рд╣реЛрдЧрд╛, рд╡рд╣ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЯреЗрд╕реНрдЯ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рдкрд╛рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдмрд╣реБрдд рд╢реЛрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

PyPy рдХреЛ рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рдХрд░, рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ CPython рдореЗрдВ рдкрд╣реБрдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдСрдЯреЛ gc'd рдорд┐рд▓реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдмрдВрдж рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рди рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИред

рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЖрдк рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ, рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╣рдо рдпрд╣рд╛рдВ рдкрд╛рдЗрдерди рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рддрд░реНрдХ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди_ рдХрд╛ рдЬрд╝реЗрди рдкрдврд╝рдирд╛, рдкрд╛рдпрдереЛрдирд┐рдХ рддрд░реАрдХрд╛ _Explicit рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рддрд╛рд░реНрде рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдореИрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рджрд░реНрд╢рди рд╕реЗ рднреА рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдБ, рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ requests рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЬрдм рднреА рдХреЛрдИ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛, рдореИрдВ CI рдпрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рдХреЗ рдЦреБрд╢ рд╣реЛрдКрдВрдЧрд╛! рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдкрд╛рдпрд╛ рд╣реИред рдпрджрд┐ рддреБрдо рдХрд░реЛ

import requests
r = requests.get('https://httpbin.org/get')
print(r.raw._pool.pool.queue[-1].sock)

рд╕реЙрдХреЗрдЯ рдЕрднреА рднреА рдЦреБрд▓рд╛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдХрд╛рд░рдг _appears_ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА _sock рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ

r.raw._pool.queue[-1].close()
print(repr(r.raw._pool.queue[-1].sock))

рдЖрдкрдХреЛ None рдореБрджреНрд░рд┐рдд рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рддреЛ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ urllib3 рд╣рд░ HTTPResponse рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдЖрдпрд╛ рдерд╛ред рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдореЗрдВ рдХрддрд╛рд░ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрд╢реБрджреНрдз рд╕реЙрдХреЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рддреНрдордХ API рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛, рдЕрдЧрд░ requests/api.py рд╣рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рддрдп рд╣реЛ рдЬрд╛рдПрдЧреА:

def request(...):
    """..."""
    s = Session()
    response = s.request(...)
    s.close()
    return s

рддрдм r.raw._pool рдЕрднреА рднреА рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди r.raw._pool.pool None ред

рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рддрдм рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд▓реЛрдЧ рд╕рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж close рд╕рддреНрд░ рд╣реЛрдирд╛ рдЧреИрд░-рд╕рдВрд╡реЗрджреА рд╣реИ рдФрд░ рд╕рддреНрд░ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкрд░рд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдПрдХ рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдмрд┐рдирд╛ рдереНрд░реЗрдбреНрд╕) рдФрд░ рдПрдХ рд╣реА рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП 100 рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ (рдФрд░ рдПрдХ рд╣реА рдпреЛрдЬрдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, https ) рдПрдХ рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреЛ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдПрдХ рдирдпрд╛ рд╕реЙрдХреЗрдЯ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 30 рд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ, r.raw._pool рдПрдХ рдмрд╣реБрдд рд╣реА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╡рд╕реНрддреБ рд╣реИред рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИ рдЬрд┐рд╕реЗ рдкреВрд▓ рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЬрдм рд╕реЙрдХреЗрдЯ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╣рд░ рдЙрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ (рд╕реНрдХреЛрдк рдореЗрдВ)ред рдЕрдЧрд░ рд╣рдо рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдХреБрдЫ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдРрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо _real_ рдореЗрдореЛрд░реА рд▓реАрдХ рдкрд╛рдПрдВрдЧреЗред

рддреЛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдореИрдВ рдерд╛ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА objgraph рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ SSLSocket рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХреЗ рдмрд╛рдж requests.get рдФрд░ рдореИрдВ рдпрд╣ рдорд┐рд▓ рдЧрдпрд╛:

socket

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ SSLSocket 7 рд╕рдВрджрд░реНрдн рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рджреЛ рдмреИрдХ рд╕рдВрджрд░реНрдн рд╣реИрдВ рдЬреЛ objgraph рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 1 рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ objgraph рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рд╡рд╣ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд▓рд┐рдП 3 рдпрд╛ 4 рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдХрд╣рд╛рдВ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВред

рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдореЗрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ:

import objgraph
import requests

r = requests.get('https://httpbin.org/get')
s = r.raw._pool.pool.queue[-1].sock
objgraph.show_backrefs(s, filename='socket.png', max_depth=15, refcounts=True)

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП

import objgraph
import requests

r = requests.get('https://httpbin.org/get')
s = r.raw._pool.pool.queue[-1].sock
objgraph.show_backrefs(s, filename='socket-before.png', max_depth=15,
                       refcounts=True)
r.raw._pool.close()
objgraph.show_backrefs(s, filename='socket-after.png', max_depth=15,
                       refcounts=True)

socket-after.png рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

socket-after

рддреЛ рд╣рдо ssl рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЬрдм рдореИрдВ s._sock рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд socket.socket рдмрдВрдж рд╣реЛрддрд╛ рд╣реИред

рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣рд╛рдБ рд╣рдордиреЗ рдЬреЛ рдкрд╛рдпрд╛ рд╣реИ:

  • close() рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИ!
  • рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ Session рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдареАрдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреГрдкрдпрд╛ # 2326 рдорд░реНрдЬ рдХрд░реЗрдВ
  • PyPy рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ JIT рдХреЗ рдмрд┐рдирд╛ рдмреЗрд╣рддрд░ рд╣реИрдВ! рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ gc.collect() рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП!

рдЯреА рдПрд▓; рдбреЙ; requests рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдиреАрдЪреЗ рдЖрдкрдХреЛ рдЗрд╕ рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдЬреЛрдбрд╝реЗ рдорд┐рд▓реЗрдВрдЧреЗ:

import requests
from memory_profiler import profile

<strong i="15">@profile</strong>
def get(session, i):
    return session.get('http://stas.nerd.ro/?{0}'.format(i))

<strong i="16">@profile</strong>
def multi_get(session, count):
    for x in xrange(count):
        resp = get(session, count+1)
        print resp, len(resp.content), x
        resp.close()

<strong i="17">@profile</strong>
def run():
    session = requests.Session()
    print 'Starting...'
    multi_get(session, 3000)
    print("Finished first round...")
    session.close()
    print 'Done.'

if __name__ == '__main__':
    run()

CPython:

Line #    Mem usage    Increment   Line Contents
================================================
    15      9.1 MiB      0.0 MiB   <strong i="23">@profile</strong>
    16                             def run():
    17      9.1 MiB      0.0 MiB       session = requests.Session()
    18      9.1 MiB      0.0 MiB       print 'Starting...'
    19      9.7 MiB      0.6 MiB       multi_get(session, 3000)
    20      9.7 MiB      0.0 MiB       print("Finished first round...")
    21      9.7 MiB      0.0 MiB       session.close()
    22      9.7 MiB      0.0 MiB       print 'Done.'

рдмрд┐рдирд╛ JIT рдХреЗ PyPy:

Line #    Mem usage    Increment   Line Contents
================================================
    15     15.0 MiB      0.0 MiB   <strong i="29">@profile</strong>
    16                             def run():
    17     15.4 MiB      0.5 MiB       session = requests.Session()
    18     15.5 MiB      0.0 MiB       print 'Starting...'
    19     31.0 MiB     15.5 MiB       multi_get(session, 3000)
    20     31.0 MiB      0.0 MiB       print("Finished first round...")
    21     31.0 MiB      0.0 MiB       session.close()
    22     31.0 MiB      0.0 MiB       print 'Done.'

JIT рдХреЗ рд╕рд╛рде PyPy:

Line #    Mem usage    Increment   Line Contents
================================================
    15     22.0 MiB      0.0 MiB   <strong i="35">@profile</strong>
    16                             def run():
    17     22.5 MiB      0.5 MiB       session = requests.Session()
    18     22.5 MiB      0.0 MiB       print 'Starting...'
    19    219.0 MiB    196.5 MiB       multi_get(session, 3000)
    20    219.0 MiB      0.0 MiB       print("Finished first round...")
    21    219.0 MiB      0.0 MiB       session.close()
    22    219.0 MiB      0.0 MiB       print 'Done.'

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рд╣рдо рд╕рднреА рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬреАрд╕реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг рдмрдбрд╝реЗ рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╣рдордиреЗ рдХрдИ рдереНрд░реЗрдб рдкреВрд▓ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдореЗрдВ рдХреЛрдИ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рджреЗрдЦрд╛)ред

JIT рдХреЗ рд╕рд╛рде PyPy рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП gc.collect() рдХреЙрд▓ рдХрд░рдирд╛, ~ 30% рдореЗрдореЛрд░реА рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рдЗрд╕реАрд▓рд┐рдП рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ JIT рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╖рдп рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ VM рдХреЛ рдХреИрд╕реЗ рдХрд╣рддрд╛ рд╣реИ рдФрд░ JIT рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо PyPy JIT рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реЗрдХреНрдЯ рдореЗрдореЛрд░реА рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддреЗ рд╣реИрдВред PyPy рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ: @alex рдХреЛ рдмреБрд▓рд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз (рдФрд░ рдХрдВрдкрдиреА) рд╕рдВрднрд╡рддрдГ рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдРрд╕рд╛ рдХреБрдЫ рднреА рд╣реЛред рдХреНрдпрд╛ рдЖрдк рддреЗрд╣ рдПрдирд╡ рдореЗрдВ PYPYLOG=jit-summary:- рд╕рд╛рде рдЕрдкрдирд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЪрд┐рдкрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА рддрдм рдХреБрдЫ рд╕рд╛рдорд╛рди рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВрдЧреЗ)

рдЙрдореНрдореАрдж рд╣реИ рдХреА рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛:

Line #    Mem usage    Increment   Line Contents
================================================
    15     23.7 MiB      0.0 MiB   <strong i="6">@profile</strong>
    16                             def run():
    17     24.1 MiB      0.4 MiB       session = requests.Session()
    18     24.1 MiB      0.0 MiB       print 'Starting...'
    19    215.1 MiB    191.0 MiB       multi_get(session, 3000)
    20    215.1 MiB      0.0 MiB       print("Finished first round...")
    21    215.1 MiB      0.0 MiB       session.close()
    22    215.1 MiB      0.0 MiB       print 'Done.'


[2cbb7c1bbbb8] {jit-summary
Tracing:        41  0.290082
Backend:        30  0.029096
TOTAL:              1612.933400
ops:                79116
recorded ops:       23091
  calls:            2567
guards:             7081
opt ops:            5530
opt guards:         1400
forcings:           198
abort: trace too long:  2
abort: compiling:   0
abort: vable escape:    9
abort: bad loop:    0
abort: force quasi-immut:   0
nvirtuals:          9318
nvholes:            1113
nvreused:           6666
Total # of loops:   23
Total # of bridges: 8
Freed # of loops:   0
Freed # of bridges: 0
[2cbb7c242e8b] jit-summary}

рдореИрдВ https://launchpad.net/~pypy/+archive/ubuntu/ppa рд╕реЗ рдирд╡реАрдирддрдо PyPy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд░реЛрд╕реЗрдордВрдж 32 рдмрд┐рдЯ рдкрд░ рд╣реВрдВ

31 рд╕рдВрдХрд▓рд┐рдд рдкрде рдЙрдкрдпреЛрдЧ рдореЗрдВ 200+ рдПрдордмреА рд░реИрдо рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреЛрдИ рдЪреАрдЬрд╝ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ
gc.dump_rpy_heap('filename.txt') рдЬрдмрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИ
рдЙрдкрдпреЛрдЧ? (рдмрд╕ рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рднреА рдХрд╛ рдПрдХ рдбрдВрдк рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛
рдореЗрдореЛрд░реА рдЬреАрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ)ред

рдлрд┐рд░ PyPy source рдЯреНрд░реА рдХреЗ рдЪреЗрдХрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде, ./pypy/tool/gcdump.py filename.txt рдЪрд▓рд╛рдПрдВ рдФрд░ рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдПрдВред

рдзрдиреНрдпрд╡рд╛рдж!

Sat Nov 08 2014 рдХреЛ 3:20:52 PM рд╕реНрдЯрд╛рд╕ рд╕реВрдХреЛрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдкрд░
рд▓рд┐рдЦрд╛ рдерд╛:

рдЙрдореНрдореАрдж рд╣реИ рдХреА рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛:

рд▓рд╛рдЗрди # рдореЗрдо рдЙрдкрдпреЛрдЧ рд╡реГрджреНрдзрд┐ рд▓рд╛рдЗрди рд╕рд╛рдордЧреНрд░реА

15     23.7 MiB      0.0 MiB   <strong i="20">@profile</strong>
16                             def run():
17     24.1 MiB      0.4 MiB       session = requests.Session()
18     24.1 MiB      0.0 MiB       print 'Starting...'
19    215.1 MiB    191.0 MiB       multi_get(session, 3000)
20    215.1 MiB      0.0 MiB       print("Finished first round...")
21    215.1 MiB      0.0 MiB       session.close()
22    215.1 MiB      0.0 MiB       print 'Done.'

[2cbb7c1bbb8] {рдЬрд┐рдд-рд╕рд╛рд░рд╛рдВрд╢
рдЯреНрд░реЗрд╕рд┐рдВрдЧ: 41 0.290082
рдмреИрдХрдПрдВрдб: 30 0.029096
рдХреБрд▓: 1612.933400
рдСрдкреНрд╕: 79116
рд░рд┐рдХреЙрд░реНрдбреЗрдб рдСрдкреНрд╕: 23091
рдХреЙрд▓: 2567
рдЧрд╛рд░реНрдб: 7081
рдСрдкреНрдЯ рдСрдкреНрд╕: 5530
рдСрдкреНрдЯ рдЧрд╛рд░реНрдб: 1400
forcings: 198
рдЧрд░реНрднрдкрд╛рдд: рдмрд╣реБрдд рд▓рдВрдмрд╛ рдЯреНрд░реЗрд╕: тАЛтАЛреи
рдЧрд░реНрднрдкрд╛рдд: рд╕рдВрдХрд▓рди: реж
рдЧрд░реНрднрдкрд╛рдд: рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрдЪ: реп
рдЧрд░реНрднрдкрд╛рдд: рдЦрд░рд╛рдм рд▓реВрдк: 0
abort: рдмрд▓ quasi-immut: 0
nvirtuals: 9318
nvholes: 1113
nvreused: 6666
рдХреБрд▓ # рдЫреЛрд░реЛрдВ рдХрд╛: 23
рдкреБрд▓реЛрдВ рдХрд╛ рдХреБрд▓ #: 8
# рдЫреЛрд░реЛрдВ рдХреА рдореБрдХреНрддрд┐: 0
рдкреБрд▓реЛрдВ рдХреЗ # рдореБрдХреНрдд: 0
[2cb77c242e8b] рдЬрд┐рдд-рд╕рд╛рд░рд╛рдВрд╢}

рдореИрдВ рдирд╡реАрдирддрдо PyPy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд░реЛрд╕реЗрдордВрдж 32 рдмрд┐рдЯ рдкрд░ рд╣реВрдВ
https://launchpad.net/~pypy/+archive/ubuntu/ppa
https://launchpad.net/%7Epypy/+archive/ubuntu/ppa

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/kennethreitz/requests/issues/1685#issuecomment -62269627
ред

рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ:

Line #    Mem usage    Increment   Line Contents
================================================
    16     22.0 MiB      0.0 MiB   <strong i="6">@profile</strong>
    17                             def run():
    18     22.5 MiB      0.5 MiB       session = requests.Session()
    19     22.5 MiB      0.0 MiB       print 'Starting...'
    20    217.2 MiB    194.7 MiB       multi_get(session, 3000)
    21    217.2 MiB      0.0 MiB       print("Finished first round...")
    22    217.2 MiB      0.0 MiB       session.close()
    23    217.2 MiB      0.0 MiB       print 'Done.'
    24    221.0 MiB      3.8 MiB       gc.dump_rpy_heap('bench.txt')


[3fd7569b13c5] {jit-summary
Tracing:        41  0.293192
Backend:        30  0.026873
TOTAL:              1615.665337
ops:                79116
recorded ops:       23091
  calls:            2567
guards:             7081
opt ops:            5530
opt guards:         1400
forcings:           198
abort: trace too long:  2
abort: compiling:   0
abort: vable escape:    9
abort: bad loop:    0
abort: force quasi-immut:   0
nvirtuals:          9318
nvholes:            1113
nvreused:           6637
Total # of loops:   23
Total # of bridges: 8
Freed # of loops:   0
Freed # of bridges: 0
[3fd756c29302] jit-summary}

рдпрд╣рд╛рдВ рдбрдВрдк: https://gist.github.com/stas/ad597c87ccc4b563211a

рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рддреЛ рдпрд╣ рд╢рд╛рдпрдж рдЙрдкрдпреЛрдЧ рдХреЗ 100MB рдХреЗ рд▓рд┐рдП рдЦрд╛рддрд╛ рд╣реИред рд╡рд╣рд╛рдБ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдмрд╛рдХреА рд╣реИ
рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, "рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА" рдореЗрдВ рдЬреАрд╕реА рд╡рд┐рднрд┐рдиреНрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рд░рд╣рддрд╛ рд╣реИ, рдФрд░
рдЧреИрд░-рдЬреАрд╕реА рдЖрд╡рдВрдЯрди рдореЗрдВ - рдЗрдирдХрд╛ рдорддрд▓рдм рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ
рдЖрд╡рдВрдЯрдиред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ
рд▓реАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпрд╛ рдЯреАрдПрд▓рдПрд╕ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдПрдХ рдЧреИрд░-рдЯреАрдПрд▓рдПрд╕ рд╕рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ?

Sat Nov 08 2014 рдХреЛ рд╢рд╛рдо 5:38:04 PM рд╕реНрдЯрд╛рд╕ рд╕реВрдХреЛрд╡ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдкрд░
рд▓рд┐рдЦрд╛ рдерд╛:

рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ:

рд▓рд╛рдЗрди # рдореЗрдо рдЙрдкрдпреЛрдЧ рд╡реГрджреНрдзрд┐ рд▓рд╛рдЗрди рд╕рд╛рдордЧреНрд░реА

16     22.0 MiB      0.0 MiB   <strong i="18">@profile</strong>
17                             def run():
18     22.5 MiB      0.5 MiB       session = requests.Session()
19     22.5 MiB      0.0 MiB       print 'Starting...'
20    217.2 MiB    194.7 MiB       multi_get(session, 3000)
21    217.2 MiB      0.0 MiB       print("Finished first round...")
22    217.2 MiB      0.0 MiB       session.close()
23    217.2 MiB      0.0 MiB       print 'Done.'
24    221.0 MiB      3.8 MiB       gc.dump_rpy_heap('bench.txt')

[3fd7569b13c5] {рдЬрд┐рдд-рд╕рд╛рд░рд╛рдВрд╢
рдЯреНрд░реЗрд╕рд┐рдВрдЧ: 41 0.293192
рдмреИрдХрдПрдВрдб: 30 0.026873
рдХреБрд▓: 1615.665337
рдСрдкреНрд╕: 79116
рд░рд┐рдХреЙрд░реНрдбреЗрдб рдСрдкреНрд╕: 23091
рдХреЙрд▓: 2567
рдЧрд╛рд░реНрдб: 7081
рдСрдкреНрдЯ рдСрдкреНрд╕: 5530
рдСрдкреНрдЯ рдЧрд╛рд░реНрдб: 1400
forcings: 198
рдЧрд░реНрднрдкрд╛рдд: рдмрд╣реБрдд рд▓рдВрдмрд╛ рдЯреНрд░реЗрд╕: тАЛтАЛреи
рдЧрд░реНрднрдкрд╛рдд: рд╕рдВрдХрд▓рди: реж
рдЧрд░реНрднрдкрд╛рдд: рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрдЪ: реп
рдЧрд░реНрднрдкрд╛рдд: рдЦрд░рд╛рдм рд▓реВрдк: 0
abort: рдмрд▓ quasi-immut: 0
nvirtuals: 9318
nvholes: 1113
nvreused: 6637
рдХреБрд▓ # рдЫреЛрд░реЛрдВ рдХрд╛: 23
рдкреБрд▓реЛрдВ рдХрд╛ рдХреБрд▓ #: 8
# рдЫреЛрд░реЛрдВ рдХреА рдореБрдХреНрддрд┐: 0
рдкреБрд▓реЛрдВ рдХреЗ # рдореБрдХреНрдд: 0
[3fd756c29302] рдЬрд┐рдд-рд╕рд╛рд░рд╛рдВрд╢}

рдпрд╣рд╛рдВ рдбрдВрдк: https://gist.github.com/stas/ad597c87ccc4b563211a

рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/kennethreitz/requests/issues/1685#issuecomment -62277822
ред

@alex ,

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ @stas рдиреЗ рдЗрд╕ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд http (рдЧреИрд░-рдПрд╕рдПрд╕рдПрд▓ / рдЯреАрдПрд▓рдПрд╕) рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ @stas рдХреА рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдореИрдХ (OSX 10.9.5 2.5 GHz i5 8 GB 1600 MHz DDR3) рдкрд░ рдирд┐рдпрдорд┐рдд http рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░реАрдлрд╝реЙрд░реНрдо рдХрд┐рдпрд╛ред

рдпрджрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ (рдЖрдкрдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП):
https://gist.github.com/mhjohnson/a13f6403c8c3a3d49b8d

рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдореБрдЭреЗ рдмрддрд╛рдУред

рдзрдиреНрдпрд╡рд╛рдж,

-рдореИрдЯ

GitHub рдХреА рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрд╣реБрдд рдвреАрд▓реА рд╣реИред рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддрдп рд╣реИред

рд╣реИрд▓реЛ, рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдХреНрд░реЙрд▓рд░ рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдпрд╛ рд╕реЙрдХреЗрдЯ рдХреЗ рдмрдлрд░ рдкрд░ рдХреБрдЫ рд░рд┐рд╕рд╛рд╡ рд╣реЛред

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдХреЛрдб рдХрд╛ рдХреБрдЫ рдирдореВрдирд╛ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВ рдпрд╛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрджрд░реНрдн рдХрд╛ рдкреЗрдбрд╝ рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдХрд┐рд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ "рд╕рд╛рдЭрд╛" (рд▓реАрдХ) рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рдзрдиреНрдпрд╡рд╛рдж

@barroca рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред рдЖрдк рд╕рдВрднрд╡рддрдГ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдПрдХ рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ stream=True рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдВрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕реЙрдХреЗрдЯ рдХреЛ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдпрджрд┐ рдореИрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ)ред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рднреА рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реИ рдХрд┐ рдЖрдк рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдХрдиреЗрдХреНрд╢рди рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреИрд╢реНрдб рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдпрд╣ рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХрд╛ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИред

@ sigmavirus24 рдзрдиреНрдпрд╡рд╛рдж рдЗрдпрд╛рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕рддреНрд░ рдХрд╛ рдХреБрдЫ рдорд┐рд╕ рдЙрдкрдпреЛрдЧ рдерд╛ред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЧрд▓рдд рдореБрджреНрджреЗ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ @barroca :)

рдЗрд╕ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреА рдХреЛрдИ рдФрд░ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдкрд░ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реВрдВ

рддреЛ, рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╣рд▓ рдХреНрдпрд╛ рд╣реИ?

@ рдореИрдХреЛрдмреЗрд╕реНрд╕реА рдореИрдВ рдпрд╣ рднреА рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

рдЕрдм рддрдХ рдореЗрд░рд╛ рдореБрджреНрджрд╛ requests рд╣реИ, рдпрд╣ рдзрд╛рдЧрд╛-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ,
рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрд▓рдЧ рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ,

рдХреИрд╢ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЦреЛрдВ url рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдХрд╛рдо рдиреЗ рдореБрдЭреЗ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдкрд╣реБрдВрдЪрд╛ рджрд┐рдпрд╛

рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдЪрд┐рдд рд╕реЗ рдЕрдзрд┐рдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм requests ThreadPoolExecutor рдпрд╛ threading ThreadPoolExecutor рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддреЗ рд╣реИрдВ,
рдЕрдВрдд рдореЗрдВ рдореИрдВ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП multiprocessing.Process рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╕рддреНрд░ рд╣реЛрддрд╛ рд╣реИ

@AndCycle рддреЛ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣рд╛рдБ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдореЗрдореЛрд░реА рд▓реАрдХ рдорд╛рдорд▓реЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ PR рдорд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВред рдФрд░ рдЖрдкрдХрд╛ рдореБрджреНрджрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

tiran picture tiran  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ghtyrant picture ghtyrant  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xsren picture xsren  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ReimarBauer picture ReimarBauer  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jake491 picture jake491  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ