Python http сервер, завершение потоков после выполнения
Есть сервер с такой реализаций многопоточности, имеется проблема - память жутко течёт, оказалось что потоки которые создаются при каждом запросе продолжают висеть в памяти. Как завершить поток после того как он ответит клиенту?
from http.server import HTTPServer, BaseHTTPRequestHandler
from http import HTTPStatus
import json, time, glob, threading, tracemalloc
from urllib import parse
from socketserver import ThreadingMixIn
#работа с сеть
class _RequestHandler(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(HTTPStatus.OK.value)
self.send_header('Content-type', 'application/json')
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
#ответ
def _write(self, val):
self.wfile.write(json.dumps(val).encode('utf-8'))
#разбор path на части url и параметры
def _parse(self, url):
P = parse.urlsplit(url)
pr = parse.parse_qsl(P.query)
params = {}
for v in pr:
k,v = v
params[k] = v
res = {
"url" : P.path.replace("/",""),
"params" : params
}
return res
#Обработчик GET запросов
def do_GET(self):
self._set_headers()
P = self._parse(self.path)
url = P["url"]
params = P["params"]
val = {}
if url == 'test1':
val["code"] = 200
self._write(val)
if url == 'test2':
val["code"] = 201
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
i = 1
for stat in top_stats[:100]:
print(stat)
self._write(val)
return 0
class ThreadingSimpleServer(ThreadingMixIn, HTTPServer):
pass
if __name__ == '__main__':
tracemalloc.start()
server_address = ('localhost', 9001)
print('Connected: %s:%d' % server_address)
server = ThreadingSimpleServer(server_address, _RequestHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
server.server_close()
Выполнив 233 тысячи раз: localhost:9001/test1 - процесс занимает в памяти 1,3ГБ Теперь если выполнить: localhost:9001/test2 - имею следующий топчик
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:817: size=128 MiB, count=233220, average=576 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:381: size=117 MiB, count=233220, average=528 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:522: size=56.9 MiB, count=1166106, average=51 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:1205: size=48.0 MiB, count=466440, average=108 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:820: size=44.5 MiB, count=1166105, average=40 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\_weakrefset.py:85: size=24.0 MiB, count=233222, average=108 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:930: size=23.1 MiB, count=466443, average=52 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:231: size=23.1 MiB, count=466442, average=52 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:250: size=21.4 MiB, count=233223, average=96 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:234: size=16.0 MiB, count=233222, average=72 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:233: size=16.0 MiB, count=233222, average=72 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:803: size=14.2 MiB, count=233221, average=64 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:751: size=13.7 MiB, count=233221, average=62 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:658: size=10.7 MiB, count=233222, average=48 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:815: size=10.7 MiB, count=233221, average=48 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:935: size=8192 KiB, count=1, average=8192 KiB
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:923: size=6377 KiB, count=233221, average=28 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:919: size=6377 KiB, count=233221, average=28 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:664: size=2007 KiB, count=1, average=2007 KiB
<frozen importlib._bootstrap_external>:587: size=46.0 KiB, count=1022, average=46 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:24: size=18.1 KiB, count=2, average=9260 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:262: size=10.8 KiB, count=98, average=113 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socket.py:334: size=8424 B, count=3, average=2808 B
<frozen importlib._bootstrap>:228: size=4604 B, count=34, average=135 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:892: size=3088 B, count=7, average=441 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:954: size=3024 B, count=6, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:912: size=3024 B, count=6, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:720: size=3024 B, count=6, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:427: size=3024 B, count=6, average=504 B
<unknown>:0: size=3024 B, count=6, average=504 B
c:\Users\user\PyСочница\test.py:35: size=2992 B, count=6, average=499 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\encodings\idna.py:292: size=2952 B, count=12, average=246 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:220: size=2880 B, count=24, average=120 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:19: size=2712 B, count=18, average=151 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:360: size=2632 B, count=7, average=376 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:650: size=2520 B, count=5, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:544: size=2520 B, count=5, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:415: size=2520 B, count=5, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\feedparser.py:466: size=2514 B, count=2, average=1257 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:533: size=2016 B, count=4, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:492: size=2016 B, count=4, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\message.py:484: size=1968 B, count=35, average=56 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:10: size=1920 B, count=21, average=91 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\encodings\idna.py:218: size=1792 B, count=10, average=179 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\encodings\idna.py:253: size=1560 B, count=8, average=195 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\encodings\idna.py:146: size=1552 B, count=8, average=194 B
c:\Users\user\PyСочница\test.py:10: size=1512 B, count=3, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\encodings\idna.py:295: size=1440 B, count=8, average=180 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socket.py:294: size=1424 B, count=4, average=356 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\tracemalloc.py:535: size=1264 B, count=3, average=421 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:227: size=1248 B, count=2, average=624 B
c:\Users\user\PyСочница\test.py:60: size=1112 B, count=1, average=1112 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:269: size=1093 B, count=2, average=546 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:252: size=1064 B, count=14, average=76 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:364: size=1056 B, count=2, average=528 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:257: size=1036 B, count=13, average=80 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:529: size=968 B, count=2, average=484 B
c:\Users\user\PyСочница\test.py:13: size=952 B, count=2, average=476 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\selectors.py:239: size=944 B, count=2, average=472 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:228: size=928 B, count=4, average=232 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\sre_compile.py:780: size=920 B, count=1, average=920 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\feedparser.py:529: size=904 B, count=2, average=452 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\feedparser.py:164: size=904 B, count=2, average=452 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\stringprep.py:247: size=868 B, count=7, average=124 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\client.py:225: size=864 B, count=2, average=432 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:140: size=856 B, count=3, average=285 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\tracemalloc.py:226: size=848 B, count=2, average=424 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\tracemalloc.py:173: size=816 B, count=2, average=408 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\feedparser.py:464: size=816 B, count=2, average=408 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\json\encoder.py:257: size=779 B, count=8, average=97 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\feedparser.py:73: size=760 B, count=7, average=109 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:937: size=658 B, count=2, average=329 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py:434: size=655 B, count=2, average=328 B
<frozen importlib._bootstrap_external>:64: size=654 B, count=5, average=131 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\_policybase.py:303: size=620 B, count=10, average=62 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:579: size=600 B, count=4, average=150 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\tracemalloc.py:533: size=576 B, count=1, average=576 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:896: size=576 B, count=1, average=576 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:285: size=576 B, count=1, average=576 B
c:\Users\user\PyСочница\test.py:17: size=560 B, count=1, average=560 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:395: size=558 B, count=2, average=279 B
c:\Users\user\PyСочница\test.py:22: size=552 B, count=1, average=552 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:580: size=552 B, count=1, average=552 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\http\server.py:405: size=552 B, count=1, average=552 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\feedparser.py:201: size=536 B, count=3, average=179 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\selectors.py:324: size=536 B, count=2, average=268 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py:574: size=536 B, count=1, average=536 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:770: size=536 B, count=1, average=536 B
c:\Users\user\PyСочница\test.py:21: size=528 B, count=1, average=528 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\json\encoder.py:199: size=528 B, count=1, average=528 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:232: size=520 B, count=1, average=520 B
<frozen importlib._bootstrap>:1007: size=520 B, count=1, average=520 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\email\feedparser.py:240: size=512 B, count=1, average=512 B
c:\Users\user\PyСочница\test.py:43: size=504 B, count=1, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:654: size=504 B, count=1, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:513: size=504 B, count=1, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socketserver.py:509: size=504 B, count=1, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\socket.py:501: size=504 B, count=1, average=504 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py:706: size=497 B, count=2, average=248 B
C:\Users\user\AppData\Local\Programs\Python\Python39\lib\urllib\parse.py:735: size=488 B, count=2, average=244 B
Очевидно есть проблема с утилизацией отработавших потоков, подскажите пожалуйста что с этим можно сделать?