from random import randint
import time
state = 0 #close
open_time = 0
failure_count = 0
count = 0
status = {0 : "closed" , 2 : " open" , 1 : "half closed"}
def circuitbreaker(func):
global count
global open_time , state
print("circuit status "+ status.get(state))
if state ==0: #close state
try:
func()
except Exception as ex:
print(ex)
count+=1
if count>2:
print("opening circuit breaker")
state = 2
open_time = int(time.time())
elif (state == 2): #open state
if( time.time() - open_time > 5) :
state = 1
else:
print("circuit opened")
else:
try:
func()
count = 0
open_time = 0
print("closing circuit breaker")
state = 0
except Exception as ex:
state = 2
open_time = int(time.time())
print("opening circuit breaker")
@circuitbreaker
def generic_func():
a = randint(0,9)
print("hello")
print("random number = "+str(a))
if a>4:
return a
else:
raise Exception('Yalla!')
if __name__=="__main__":
# while(True):
# generic_func()
time.sleep(1)
У меня есть этот код.У меня есть пара вопросов: - 1) почему вызывается общая функция, даже если я комментирую ее в main.
2), когда я раскомментирую закомментированную часть в главной функции.Я получаю следующую ошибку. Как правильно вызвать эту универсальную функцию?Мой мотив состоит в том, чтобы реализовать автоматический выключатель, который замыкается при возникновении какой-либо ошибки или исключения в вызывающей функции.Я могу напрямую использовать: - автоматический выключатель (вызывающая функция), но я хотел использовать декораторы
Traceback (most recent call last):
circuit status closed
hello
File "/Users/abhishekkumar/PycharmProjects/RateLimiter/circuitbreaker.py", line 53, in <module>
random number = 1
Yalla!
generic_func()
TypeError: 'NoneType' object is not callable
Process finished with exit code 1
Проблема заключалась в том, что декоратор должен возвращать объект функции и иметь соответствующую логику внутри функции, а затем возвращать эту функциюв противном случае он не возвращает ни одного объекта