diff --git a/app/main.py b/app/main.py index 5f0c04e..e7d2bab 100644 --- a/app/main.py +++ b/app/main.py @@ -1,4 +1,7 @@ import uvicorn + +from threading import Thread +from queue import Queue from buffer import Buffer from os import environ @@ -38,23 +41,39 @@ def check(payload: LoadRequest, _: None = Depends(verify_api_key)): @app.post(f"/check", response_model=CheckResponse) def load(payload: CheckRequest, _: None = Depends(verify_api_key)): + def check_buffer(buffer, output_queue): + pattern_index = 0 + exists = False + for number in buffer: + if number == payload.pattern[pattern_index] or payload.pattern[pattern_index] is None: + pattern_index += 1 + if pattern_index == len(payload.pattern): + exists = True + break + else: + pattern_index = 0 + output_queue.put(exists) + if len(Buffer.data) == 0: raise HTTPException(400, {"reason": "Buffer is empty"}) if len(payload.pattern) == 0: raise HTTPException(400, {"reason": "Pattern cannot be empty"}) if len(payload.pattern) > MAX_LENGTH: raise HTTPException(413, {"reason": f"Pattern cannot be longer than {MAX_LENGTH}"}) - pattern_index = 0 + + threads = [] + results = Queue() exists = False - for number in Buffer.data: - if number == payload.pattern[pattern_index] or payload.pattern[pattern_index] is None: - pattern_index += 1 - if pattern_index == len(payload.pattern): - exists = True - break - else: - pattern_index = 0 - # Buffer.clear() + chunk_size = 50 + for i in range(max(len(Buffer.data) // chunk_size, 1)): + thread = Thread(target=check_buffer, args=(Buffer.data[i*chunk_size:i*chunk_size + chunk_size*2], results), daemon=True) + thread.start() + threads.append(thread) + for _ in range(len(threads)): + if results.get(): + exists = True + break + Buffer.clear() return CheckResponse(exists=exists)