Найти - Пользователи
Полная версия: Запуск двух скриптов с переменными одного процесса
Начало » Python для экспертов » Запуск двух скриптов с переменными одного процесса
1
scurramalum
Добрый день, знатоки.
Стоит такая задача:
есть некий коннектор к 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
вижу решение через запись переменной в файл или в базу данных, откуда каждый экземпляр будет читать то же свойство…но интересно, возможно ли это осуществить как то по другому…

Всем спасибо за помощь и размышления!
inoks
Celery?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB