Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 3, 2016 21:11:55

scurramalum
Зарегистрирован: 2014-07-22
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Запуск двух скриптов с переменными одного процесса

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

Всем спасибо за помощь и размышления!

Офлайн

#2 Окт. 13, 2016 15:51:00

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Запуск двух скриптов с переменными одного процесса

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version