Requests: рдореЗрдореЛрд░реА рд▓реАрдХ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЕрдкреНрд░реИрд▓ 2018  ┬╖  22рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: psf/requests

рд╕рд╛рд░рд╛рдВрд╢ред

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо

рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо

рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░рдиреЗ рддрдХ рд╕рднреА рд░рд╛рдо рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо

рдкреНрд░рдЬрдирди рдХрджрдо

рдЫрджреНрдо рдХреЛрдб:

def function():
    proxies = {
        'https': proxy
    }
    session = requests.Session()
    session.headers.update({'User-Agent': 'user - agent'})
    try:                                           #
        login = session.get(url, proxies=proxies)  # HERE IS WHERE MEMORY LEAKS
    except:                                        #
        return -1                                  #
    return 0

рд╡реНрдпрд╡рд╕реНрдерд╛ рдЬрд╛рдирдХрд╛рд░реА

$ python -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.6"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.3"
  },
  "platform": {
    "release": "10",
    "system": "Windows"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.18.4"
  },
  "system_ssl": {
    "version": "100020bf"
  },
  "urllib3": {
    "version": "1.22"
  },
  "using_pyopenssl": false
}
Needs Info Propose Close

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

рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдореБрджреНрджрд╛ред рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓рддреЗ рд╕рдордп рдЕрдиреБрд░реЛрдз рд╕реНрдореГрддрд┐ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб:

import gc
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
from memory_profiler import profile

def run_thread_request(sess, run):
    response = sess.get('https://www.google.com')
    return

<strong i="6">@profile</strong>
def main():
    sess = requests.session()
    with ThreadPoolExecutor(max_workers=1) as executor:
        print('Starting!')
        tasks = {executor.submit(run_thread_request, sess, run):
                    run for run in range(50)}
        for _ in as_completed(tasks):
            pass
    print('Done!')
    return

<strong i="7">@profile</strong>
def calling():
    main()
    gc.collect()
    return

if __name__ == '__main__':
    calling()

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдореИрдВ рдПрдХ рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ requests.get рдЪрд▓рд╛рдиреЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реВрдВ рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

тЮЬ  thread-test pipenv run python run.py
Starting!
Done!
Filename: run.py

Line #    Mem usage    Increment   Line Contents
================================================
    10     23.2 MiB     23.2 MiB   <strong i="13">@profile</strong>
    11                             def main():
    12     23.2 MiB      0.0 MiB       sess = requests.session()
    13     23.2 MiB      0.0 MiB       with ThreadPoolExecutor(max_workers=1) as executor:
    14     23.2 MiB      0.0 MiB           print('Starting!')
    15     23.4 MiB      0.0 MiB           tasks = {executor.submit(run_thread_request, sess, run):
    16     23.4 MiB      0.0 MiB                       run for run in range(50)}
    17     25.8 MiB      2.4 MiB           for _ in as_completed(tasks):
    18     25.8 MiB      0.0 MiB               pass
    19     25.8 MiB      0.0 MiB       print('Done!')
    20     25.8 MiB      0.0 MiB       return


Filename: run.py

Line #    Mem usage    Increment   Line Contents
================================================
    22     23.2 MiB     23.2 MiB   <strong i="14">@profile</strong>
    23                             def calling():
    24     25.8 MiB      2.6 MiB       main()
    25     25.8 MiB      0.0 MiB       gc.collect()
    26     25.8 MiB      0.0 MiB       return

рдФрд░ рдкрд┐рдкрдлрд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[requires]
python_version = "3.6"

[packages]
requests = "==2.21.0"
memory-profiler = "==0.55.0"

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

рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ

python -m requests.help

рдпрджрд┐ рд╡рд╣ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо (рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо, рдЖрджрд┐) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

@sigmavirus24 рд╣реЛ рдЧрдпрд╛

рдЕрд░реЗ @munroc , рдЖрдкрдХреЗ рдереНрд░реЗрдбрд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рддреНрд╡рд░рд┐рдд рдкреНрд░рд╢реНрди рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред

  • рдХреНрдпрд╛ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рддреНрд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдк рдХрд┐рд╕ рдереНрд░реЗрдбрдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

  • рд░рд┐рд╕рд╛рд╡ рдХрд╣рд╛рдБ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд┐рд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рд╣рдореЗрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рддреНрд░реЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЗ рд╕рдВрдХреЗрдд рдорд┐рд▓реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдзреВрдореНрд░рдкрд╛рди рдмрдВрджреВрдХ рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрд╖реНрдЯрд┐ рдкреНрд░рднрд╛рд╡ рдорд┐рд▓рд╛ рд╣реИред

@nateprewitt рд╣реИрд▓реЛ, рд╣рд╛рдБ, рдореИрдВ рд╣рд░ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рддреНрд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдБред рдереНрд░реЗрдб рдкреВрд▓ 30 рд╣реИред рдореИрдВрдиреЗ рд╡реИрд╕реЗ рднреА 2 - 200 рдзрд╛рдЧреЗ рдФрд░ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдЕрднреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рд╣реИ:
рд▓реЙрдЧрд┐рди = session.get рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рдкрд╕реА 0 рдбрд╛рд▓реЗрдВ рдФрд░ рдХреЛрдИ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдирд╣реАрдВред рдЕрдЧрд░ рдореИрдВ рд▓реЙрдЧрд┐рди = рд╕рддреНрд░ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕реА 0 рдбрд╛рд▓рддрд╛ рд╣реВрдВред рд╕реНрдореГрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдореИрдВ рдЖрдкрдХреЛ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВ рдореЗрд░рд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред

@Munroc рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░рд╛ рдХреЛрдб рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рд╕рд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк return рддреБрд░рдВрдд рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ session.get , рддреЛ рдХреЗрд╡рд▓ proxies рдФрд░ session рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдореЛрд░реА рдореЗрдВ рдореМрдЬреВрдж рд░рд╣реЗрдВрдЧреЗ (рдУрд╡рд░рд╕рд┐рдореНрдкреНрд▓реАрдлрд╛рдЗрдб.. рд▓реЗрдХрд┐рди рдореИрдВ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓ рдЧрдпрд╛ рд╣реЛрдЧрд╛: рдореБрд╕реНрдХрд╛рди :)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдк рдПрдХ рдмрд╛рд░ рдлреЛрди session.get(url, proxies=proxies) , рдХреЗ рдПрдЪрдЯреАрдПрдордПрд▓ url рдФрд░ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрд╛ login рдЪрд░ред рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ session.get рдХреЙрд▓ "рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛" рдХрд┐ рд╡реЗ рд╕реНрдореГрддрд┐ рдХреЛ рд▓реАрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (рд╕реНрдореГрддрд┐) рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ url рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рддреБрд░рдВрдд рдмрд╛рдж рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдФрд░ .join() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдзрд╛рдЧреЗ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдП рдЧрдП - рдФрд░ рдХреНрдпрд╛ рд╡реЗ рдареАрдХ рд╕реЗ рдмрдВрдж/рд╕рд╛рдл рдХрд┐рдП рдЧрдП рдереЗред

@LeoSZN рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдХрдИ Process рдкреНрд░рддрд┐ urls рддрддреНрд╡реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо Process рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдВрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк p.daemon = True рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдореЛрдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ (рддрд╛рдХрд┐ рдПрдХ рдмрд╛рд░ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП, рд╕рднреА рдЙрддреНрдкрдиреНрди рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рднреА рдорд░ рдЬрд╛рддреА рд╣реИрдВ)? рдЕрдиреНрдпрдерд╛, рдЙрддреНрдкрдиреНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ рдФрд░ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди рд╕рднреА рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

@initbar

рдХреНрдпрд╛ рдореБрдЭреЗ p.daemon = True рд▓реВрдк рдореЗрдВ рдпрд╛ рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ p.join() рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╡реИрд╕реЗ рдХреНрдпрд╛ рдореБрдЭреЗ p.join() рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА p.daemon = True ?

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

рдореИрдВ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмреЙрдЯ рдЪрд▓рд╛рддреЗ рд╕рдордп рдлреНрд░реА рдореЗрдореЛрд░реА рдбрд┐рдЧреНрд░реЗрдбреЗрд╢рди рджреЗрдЦрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдЕрдкрдиреЗ рдХреЛрдб рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИ; рддрдм рдореБрдЭреЗ рдмреЙрдЯ рдкрд░ рд╕рдВрджреЗрд╣ рд╣реБрдЖ рдФрд░ рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдЖрдпрд╛ред :)
рдореИрдВрдиреЗ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП len(gc.get_objects()) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╕рдВрдЪрд╛рд░ рджрд┐рдирдЪрд░реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдлрд┐рд░ рд╕рднреА рдмреЙрдЯ рдХреЛрдб рдХреЛ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЬреАрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдЧрд┐рдирддреА рдмрдврд╝рд╛рддрд╛ рд╣реИред

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо

рд▓реЗрди (gc.get_objects ()) рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо

рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ len(gc.get_objects()) рдХрд╛ рдорд╛рди рдмрдврд╝рддрд╛ рд╣реИред

Test N2
GetObjects len: 27959
Test N3
GetObjects len: 27960
Test N4
GetObjects len: 27961
Test N5
GetObjects len: 27962
Test N6
GetObjects len: 27963
Test N7
GetObjects len: 27964

рдкреНрд░рдЬрдирди рдХрджрдо

token = "XXX:XXX"
chat_id = '111'
proxy = {'https':'socks5h://ZZZ'} #You may need proxy to run this in Russia

from time import sleep
import gc, requests

def garbage_info():
    res = ""
    res += "\nGetObjects len: " + str(len(gc.get_objects()))
    return res

def tester():
    count = 0
    while(True):
        sleep(1)
        count += 1
        msg = "\nTest N{0}".format(count) + garbage_info()
        print(msg)

        method_url = r'sendMessage'
        payload = {'chat_id': str(chat_id), 'text': msg}

        request_url = "https://api.telegram.org/bot{0}/{1}".format(token, method_url)
        method_name = 'get'

        session = requests.session()
        req = requests.Request(
            method=method_name.upper(),
            url=request_url,
            params=payload
        )
        prep = session.prepare_request(req)

        settings = session.merge_environment_settings(
            prep.url, None, None, None, None)
#            prep.url, proxy, None, None, None)  #Change the line to enable proxy
        send_kwargs = {
            'timeout': None,
            'allow_redirects': None,
        }
        send_kwargs.update(settings)
        resp = session.send(prep, **send_kwargs)

        # For more clean output
        gc.collect()

tester()

рд╡реНрдпрд╡рд╕реНрдерд╛ рдЬрд╛рдирдХрд╛рд░реА

{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": "2.3.1"
  },
  "idna": {
    "version": "2.7"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.6"
  },
  "platform": {
    "release": "4.15.0-36-generic",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "1010009f",
    "version": "17.5.0"
  },
  "requests": {
    "version": "2.19.1"
  },
  "system_ssl": {
    "version": "1010007f"
  },
  "urllib3": {
    "version": "1.23"
  },
  "using_pyopenssl": true
}

_рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛ рдореИрдВрдиреЗ рд╡рд┐рдВрдбреЛрдЬ 10 рдкрд░ рдкрд╛рдпрдерди 3.5.3 рдкрд░ рдХрд┐рдпрд╛ рдерд╛ред_

@LeoSZN

@initbar

рдХреНрдпрд╛ рдореБрдЭреЗ p.daemon = True рд▓реВрдк рдореЗрдВ рдпрд╛ рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ p.join() рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╡реИрд╕реЗ рдХреНрдпрд╛ рдореБрдЭреЗ p.join() рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА p.daemon = True ?

# ..
     for i in urls:
        p = Process(target=main, args=(i,))
        p.daemon = True  # before `.start`
        p.start()
# ..

рдПрдХ рдЫреЛрдЯреА рд╕реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЕрднреА рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ .join рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдбреЗрдореЙрди - рд▓реЗрдХрд┐рди рд╡реЗ рд▓рдЧрднрдЧ рдЧрд╛рд░рдВрдЯреА рдорд╛рд░реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдЙрдирдХреЗ рдорд╛рддрд╛ рдкрд┐рддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд (рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдмрди рдЕрдирдЬрд╛рдиреЗ рдЕрдирд╛рде, рдЬреЛ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ! рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрдпрд╛рд░ рд╣реИ)ред

рдЕрдиреНрдпрдерд╛, рдЖрдк Process рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд▓рдЧ рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

# ..
processes = [ 
  Process(target=main, args=(i,))
  for i in urls
]
# start the process activity.

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо

рд▓реЗрди (gc.get_objects ()) рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП

рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг "рдЕрдиреБрд░реЛрдз" рдХреИрд╢ рддрдВрддреНрд░ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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

рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдореБрджреНрджрд╛ред рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓рддреЗ рд╕рдордп рдЕрдиреБрд░реЛрдз рд╕реНрдореГрддрд┐ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб:

import gc
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
from memory_profiler import profile

def run_thread_request(sess, run):
    response = sess.get('https://www.google.com')
    return

<strong i="6">@profile</strong>
def main():
    sess = requests.session()
    with ThreadPoolExecutor(max_workers=1) as executor:
        print('Starting!')
        tasks = {executor.submit(run_thread_request, sess, run):
                    run for run in range(50)}
        for _ in as_completed(tasks):
            pass
    print('Done!')
    return

<strong i="7">@profile</strong>
def calling():
    main()
    gc.collect()
    return

if __name__ == '__main__':
    calling()

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдореИрдВ рдПрдХ рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ requests.get рдЪрд▓рд╛рдиреЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реВрдВ рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

тЮЬ  thread-test pipenv run python run.py
Starting!
Done!
Filename: run.py

Line #    Mem usage    Increment   Line Contents
================================================
    10     23.2 MiB     23.2 MiB   <strong i="13">@profile</strong>
    11                             def main():
    12     23.2 MiB      0.0 MiB       sess = requests.session()
    13     23.2 MiB      0.0 MiB       with ThreadPoolExecutor(max_workers=1) as executor:
    14     23.2 MiB      0.0 MiB           print('Starting!')
    15     23.4 MiB      0.0 MiB           tasks = {executor.submit(run_thread_request, sess, run):
    16     23.4 MiB      0.0 MiB                       run for run in range(50)}
    17     25.8 MiB      2.4 MiB           for _ in as_completed(tasks):
    18     25.8 MiB      0.0 MiB               pass
    19     25.8 MiB      0.0 MiB       print('Done!')
    20     25.8 MiB      0.0 MiB       return


Filename: run.py

Line #    Mem usage    Increment   Line Contents
================================================
    22     23.2 MiB     23.2 MiB   <strong i="14">@profile</strong>
    23                             def calling():
    24     25.8 MiB      2.6 MiB       main()
    25     25.8 MiB      0.0 MiB       gc.collect()
    26     25.8 MiB      0.0 MiB       return

рдФрд░ рдкрд┐рдкрдлрд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[requires]
python_version = "3.6"

[packages]
requests = "==2.21.0"
memory-profiler = "==0.55.0"

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдореИрдВ рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐

https://github.com/nicolargo/glances/issues/1447

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЛ рд▓рдЧрднрдЧ 0.1 - 0.9 рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмрд╛рдж рд╕реНрд╡рдпрдВ рдХреЛ "рд╕рдорд╛рд╢реЛрдзрди" рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╡рд╣реА, рдХреЛрдИ рдХрд╛рдордХрд╛рдЬ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ verify=False рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдореИрдВрдиреЗ #5215 рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдПрдХ рдмрдЧ рдЙрдард╛рдпрд╛ рд╣реИ


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

requests.get рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рд╕реНрдкреЙрдиреНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрдХрд░ рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рд░реЗрдВрдЧрддрд╛ рд╣реБрдЖ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рд▓реВрдк рд╕реЗ requests.get рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ рдпрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ urllib3 рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рд░реЗрдВрдЧрдиреЗ рдкрд░ рдмрд╣реБрдд рдХрдо рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рджреЛ рдШрдВрдЯреЗ рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ рдФрд░ requests.get рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рджреЛ рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж 1GB+ рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрдмрдХрд┐ urllib3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ рд╣реЛрддрд╛ рд╣реИред рджреЛ рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж 20mbред

рдкрд╛рдпрдерди 3.7.4 рдФрд░ рдЕрдиреБрд░реЛрдз 2.22.0

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдЕрднреА рднреА рдмреАрдЯрд╛ рдЪрд░рдг рдореЗрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рд╣реИред рдЪрд▓реЛ, рджреЛрд╕реНрддреЛрдВ, рдЗрд╕реЗ рдкреИрдЪ рдЕрдк рдХрд░реЗрдВ! рдореИрдВ

рдЗрд╕ рдкрд░ рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди? рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреЗ рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг POST рдЕрдиреБрд░реЛрдз рднреА рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреЗ рд╕рдорд╛рди рдореБрджреНрджреЗ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣реА ... рдереНрд░реЗрдбрдкреВрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рд░рд┐рд╕рд╛рд╡ рд╡рд┐рдВрдбреЛрдЬ рдкрд╛рдпрдерди 38 рдкрд░ рднреА рд╣реИред
рдЕрдиреБрд░реЛрдз 2.22.0

рдореЗрд░реЗ рд▓рд┐рдП рднреА рдРрд╕рд╛

рдпрд╣рд╛рдБ рдореЗрд░реА рдореЗрдореЛрд░реА рд▓реАрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреЛрдИ рднреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ? https://stackoverflow.com/questions/59746125/memory-keep-growth-when-using-mutil-thread-download-file

рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП Session.close() рдФрд░ Response.close() рдХреЙрд▓ рдХрд░реЗрдВред
рдФрд░ ssl рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХрд░реЗрдЧрд╛ рдЗрд╕рд▓рд┐рдП https urls рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдкрд░ рдореЗрдореЛрд░реА рд▓реАрдХ рдЕрдзрд┐рдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реЛрдЧреАред

рдкрд╣рд▓реЗ рдореИрдВ 4 рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдХрд░рддрд╛ рд╣реВрдВ:

  1. рдЕрдиреБрд░реЛрдз + рдПрд╕рдПрд╕рдПрд▓ (https://)
  2. рдЕрдиреБрд░реЛрдз + рдЧреИрд░-рдПрд╕рдПрд╕рдПрд▓ (http://)
  3. aiohttp + ssl (https://)
  4. aiohttp + рдЧреИрд░-рдПрд╕рдПрд╕рдПрд▓ (http://)

рдЫрджреНрдо рдХреЛрдб:

def run(url):
    session = requests.session()
    response = session.get(url)

while True:
    for url in urls:  # about 5k urls of public websites
        # execute in thread pool, size=10
        thread_pool.submit(run, url)

# in another thread, record memory usage every seconds

рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдЧреНрд░рд╛рдл (y-рдЕрдХреНрд╖: MB, x-рдЕрдХреНрд╖: рд╕рдордп), рдЕрдиреБрд░реЛрдз рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореЗрдореЛрд░реА рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдмрдврд╝рддреА рд╣реИ, рдЬрдмрдХрд┐ aiohttp рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рд╕реНрдерд┐рд░ рд╣реИ:

requests-non-ssl
requests-ssl

aiohttp-non-ssl
aiohttp-ssl

рдлрд┐рд░ рдореИрдВ Session.close() рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ:

def run(url):
    session = requests.session()
    response = session.get(url)
    session.close()  # close session !!

рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдХрдореА рдЖрдИ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдЕрднреА рднреА рд╕рдордп рдХреЗ рд╕рд╛рде рдмрдврд╝рддрд╛ рд╣реИ:

requests-non-ssl-close-session
requests-ssl-close-session

рдЕрдВрдд рдореЗрдВ рдореИрдВ Response.close() рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ:

def run(url):
    session = requests.session()
    response = session.get(url)
    session.close()  # close session !!
    response.close()  # close response !!

рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд┐рд░ рд╕реЗ рдХрдо рд╣реЛ рдЧрдпрд╛, рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрдврд╝рд╛:

requests-non-ssl-close-all
requests-ssl-close-all

aiohttp рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ ssl рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХрдиреЗрдХреНрд╢рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмрдВрдж рди рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ:

class MemoryReporter:
    def __init__(self, name):
        self.name = name
        self.file = open(f'memoryleak/memory_{name}.txt', 'w')
        self.thread = None

    def _get_memory(self):
        return psutil.Process().memory_info().rss

    def main(self):
        while True:
            t = time.time()
            v = self._get_memory()
            self.file.write(f'{t},{v}\n')
            self.file.flush()
            time.sleep(1)

    def start(self):
        self.thread = Thread(target=self.main, name=self.name, daemon=True)
        self.thread.start()


def plot_memory(name):
    filepath = 'memoryleak/memory_{}.txt'.format(name)
    df_mem = pd.read_csv(filepath, index_col=0, names=['t', 'v'])
    df_mem.index = pd.to_datetime(df_mem.index, unit='s')
    df_mem.v = df_mem.v / 1024 / 1024
    df_mem.plot(figsize=(16, 8))

рд╡реНрдпрд╡рд╕реНрдерд╛ рдЬрд╛рдирдХрд╛рд░реА:

$ python -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.8"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.7.4"
  },
  "platform": {
    "release": "18.0.0",
    "system": "Darwin"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.22.0"
  },
  "system_ssl": {
    "version": "1010104f"
  },
  "urllib3": {
    "version": "1.25.6"
  },
  "using_pyopenssl": false
}

рдПрд╕рдПрд╕рдПрд▓ рд░рд┐рд╕рд╛рд╡ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдФрд░ рдУрдПрд╕рдПрдХреНрд╕ рдкрд░ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ <= 3.7.4 рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕рдВрджрд░реНрдн рд╕реЗ рд╕реНрдореГрддрд┐ рдХреЛ рдареАрдХ рд╕реЗ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

https://github.com/VeNoMouS/cloudscraper/issues/143#issuecomment -613092377

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

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

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

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

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

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

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