Достигните механизма пула потоков, используя Gunicorn - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть приложение 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, где каждая операция может иметь свой размер пула.

Есть ли как я могу этого достичь.

...