Стоит такая задача:
есть некий коннектор к API, выполнен конечно в виде класса. Приложение Django, которое в различных кусках кода и различные моменты времени инициализирует соединение и отправляет запрос к API стороннего приложения. Однако из за ограничения кол-ва одновременных запросов к другой стороне, необходимо, чтобы даже если и произошла инициализация второго коннекта, то отправка запросов не произошла, пока первый инициализированный коннект (и все предыдущие) не закончили отправку данных.
Как вижу мое решение (в упрощенном варианте):
import time import threading class Class(object): connect = None def __new__(cls, *args, **kwargs): return super().__new__(cls) @staticmethod def work(cls, name): while cls.connect: print('Ожидаем....%s' % name) time.sleep(1) else: cls.connect = True print('Блокировка %s' % name) time.sleep(1) print('Работаем....%s' % name) time.sleep(1) print('Работаем....%s' % name) time.sleep(1) print('Работаем....%s' % name) time.sleep(1) print('Работаем....%s' % name) time.sleep(1) print('Работаем....%s' % name) time.sleep(1) print('Разблокировка %s' % name) cls.connect = None a = Class() b = Class() if __name__ == '__main__': print(a.connect) print(b.connect) t1 = threading.Thread(target=a.work, args=(Class, 'A')) t2 = threading.Thread(target=b.work, args=(Class, 'B')) t1.start() t2.start()
Соответственно создаем класс Синглтон, “экземпляры” которого меняют внутреннее свойство класса, и пока оно в нужном значении (True) - ожидают изменение статуса, и не отправляют запросы. Все это работает, но есть огромное подозрение что не будет работать в приложении Django, так как в данном примере (в качестве теста) используются 2 потока, а джанго приложение запускается в 8 процессах. И на сколько понимаю, у каждого процесса будут свои экземпляры, и действовать данный вариант будет только в рамках каждого из этих процессов, что не есть хорошо.
Подскажите, как можно реализовать данную задачу, какие есть пути ее решения?
И еще один момент, некоторые скрипты будут запускаться по cron, и использовать тоже данный коннектор, а значит (может ошибаюсь, поправьте если не так) они будут запускаться вне даже этих 8ми процессов. Как можно проконтролировать эту ситуацию?
PS
вижу решение через запись переменной в файл или в базу данных, откуда каждый экземпляр будет читать то же свойство…но интересно, возможно ли это осуществить как то по другому…
Всем спасибо за помощь и размышления!