staticmethods с веб-сервисом django - неожиданное поведение. Должен создать только 1 экземпляр (синглтон) - PullRequest
0 голосов
/ 16 апреля 2019

@ staticmethod в django не работает.Статический метод должен выполняться только один.Однако для тестирования я сделал 3 вызова параллельно, а статический метод был вызван 3 раза.Ниже приведены код и выход:

Код:

class KafkaReceiver:
    _kafka_consumer = None
    def __init__(self, topic):
        KafkaReceiver._kafka_consumer = self.create_only_one_consumer()

    @staticmethod
    def create_only_one_consumer():
        if KafkaReceiver._kafka_consumer is None:
            KafkaReceiver._kafka_consumer = KafkaConsumer(KafkaReceiver._topic)
            print("Consumer Created......")
        return KafkaReceiver._kafka_consumer

Выход:

Consumer Created......
Consumer Created......
Consumer Created......

Код параллельного вызова:

r1 = grequests.get('http://localhost:5014/message/?message=hello', callback=do_something)#, hooks = {'response' : do_something})
r2 = grequests.get('http://localhost:5014/message/?message=helloworld', callback=do_something)#, hooks = {'response' : do_something})
r3 = grequests.get('http://localhost:5014/message/?message=hellothere', callback=do_something)#, hooks = {'response' : do_something})

grequests.map([r1, r2, r3])

Что ожидается: Для каждого вызова веб-службы django, django создает (я думаю) новый поток.Тем не менее, класс здесь не должен создавать экземпляр потребителя.Это проблема блокировки (я пробовал lock и RLock, она не работает с django)

Вторая странная вещь - при дальнейших вызовах django этот статический метод не выполняется.

...