feat: Semaine 8
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
import time
|
||||
|
||||
class CircuitBreaker:
|
||||
def __init__(self, failure_threshold: int = 3, recovery_timeout: int = 10) -> None:
|
||||
self.failure_threshold = failure_threshold
|
||||
self.recovery_timeout = recovery_timeout
|
||||
self.failure_count = 0
|
||||
self.last_failure_time = None
|
||||
self.state = "CLOSED" # OPEN, CLOSED, HALF-OPEN
|
||||
|
||||
def call(self, function, *args, **kwargs):
|
||||
if self.state == "OPEN" and self.last_failure_time is not None:
|
||||
if time.time() - self.last_failure_time >= self.recovery_timeout:
|
||||
self.state = "HALF-OPEN"
|
||||
else:
|
||||
raise Exception("Circuit is open")
|
||||
|
||||
try:
|
||||
result = function(*args, **kwargs)
|
||||
self.on_success()
|
||||
return result
|
||||
except Exception as error:
|
||||
self.on_failure()
|
||||
raise error
|
||||
|
||||
def on_success(self):
|
||||
self.failure_count = 0
|
||||
self.state = "CLOSED"
|
||||
|
||||
def on_failure(self):
|
||||
self.failure_count += 1
|
||||
self.last_failure_time = time.time()
|
||||
if self.failure_count >= self.failure_threshold:
|
||||
self.state = "OPEN"
|
||||
Reference in New Issue
Block a user