У меня есть приложение flask, работающее в режиме разработки с двумя API, и оно будет выполнять некоторые длительные операции (30 минут).
Позволяет вызывать API как API_1 и API_2.
Поэтому, когда пользователь запускает API_1, API немедленно возвращает OK
в качестве ответа и продолжает работу API_1 в фоновом режиме. То же самое для API_2.
Это было сделано путем создания потока и запуска в фоновом режиме
t1 = Thread(target=function_name,args=args)
t1.start()
Недавно я столкнулся с проблемой, состоящей в том, что API-интерфейс запускался клиентом несколько раз параллельно, и все приложение работало медленно. Чтобы исправить это, я реализовал механизм ThreadPool, используя Queue
. Каждый API имеет свой размер пула потоков.
class Worker(threading.Thread):
def __init__(self, tasks):
super().__init__()
self.tasks = tasks
self.start()
def run(self):
while True:
func, args, kwargs = self.tasks.get()
try:
func(*args, **kwargs)
except Exception:
# An exception happened in this thread
traceback.print_exc()
finally:
# Mark this task as done, whether an exception happened or not
self.tasks.task_done()
class ThreadPool:
def __init__(self, num_threads):
self.tasks = queue.Queue(num_threads)
for _ in range(num_threads):
Worker(self.tasks)
def add_task(self, func, *args, **kargs):
self.tasks.put((func, args, kargs))
Я пытаюсь найти способ реализовать механизм пула потоков с использованием конфигурации gunicorn, где каждая операция может иметь свой размер пула.
Есть ли как я могу этого достичь.