Skip to content

Commit 3e10da6

Browse files
committed
Use ThreadPoolExecutor to start threads to avoid memory leaks
1 parent d79552f commit 3e10da6

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ private
99
testing.yaml
1010
example.yaml
1111
exmqtt.yaml
12+
min.yaml
1213
__pycache__

api.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from fastapi.responses import Response, StreamingResponse
1010
from fastapi.staticfiles import StaticFiles
1111
from streamer import Streamer
12+
from concurrent.futures import ThreadPoolExecutor
1213
from prometheus_fastapi_instrumentator import Instrumentator
1314

1415
import tracemalloc
@@ -55,11 +56,10 @@ async def detect(detect_request: odrpc.DetectRequest, response: Response):
5556
async def detect_stream(websocket: WebSocket):
5657
await websocket.accept()
5758
detect_responses = asyncio.Queue()
59+
executor = ThreadPoolExecutor()
5860
async def detect_handle(detect_request: odrpc.DetectRequest):
59-
loop = asyncio.get_event_loop()
60-
fut = loop.run_in_executor(None, self.doods.detect, detect_request)
6161
try:
62-
detect_response = await asyncio.wait_for(fut, 300) # Kill it and exit after 5 minutes
62+
detect_response = self.doods.detect(detect_request)
6363
if detect_request.image:
6464
detect_response.image = base64.b64encode(detect_response.image)
6565
await detect_responses.put(detect_response)
@@ -68,9 +68,10 @@ async def detect_handle(detect_request: odrpc.DetectRequest):
6868
except Exception as e:
6969
self.logger.error("Exception({0}):{1!r}".format(type(e).__name__, e.args))
7070

71-
def detect_thread(loop, detect_request: odrpc.DetectRequest):
71+
def detect_thread(detect_request: odrpc.DetectRequest):
72+
loop = asyncio.new_event_loop()
73+
asyncio.set_event_loop(loop)
7274
try:
73-
asyncio.set_event_loop(loop)
7475
loop.run_until_complete(detect_handle(detect_request))
7576
loop.close()
7677
except Exception as e:
@@ -91,16 +92,17 @@ async def send_detect_responses():
9192
try:
9293
detect_config = await websocket.receive_json()
9394
detect_request = odrpc.DetectRequest(**detect_config)
94-
loop = asyncio.new_event_loop()
95-
threading.Thread(target=detect_thread, args=(loop, detect_request,)).start()
95+
executor.submit(detect_thread, detect_request)
9696
except TypeError:
9797
await detect_responses.put(odrpc.DetectResponse(error='could not parse request body'))
9898
except WebSocketDisconnect:
9999
send_detect_responses_task.cancel()
100+
executor.shutdown()
100101
break
101102
except Exception as e:
102103
self.logger.error("Exception({0}):{1!r}".format(type(e).__name__, e.args))
103104
send_detect_responses_task.cancel()
105+
executor.shutdown()
104106
break
105107

106108
@self.api.post("/image")

0 commit comments

Comments
 (0)