From: Fredrik Tolf Date: Sun, 5 Jan 2014 10:45:14 +0000 (+0100) Subject: python: Added an optional request limiter for freethread. X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=commitdiff_plain;h=002ee932fc0b689ce424a7ef7a1efb9491cb7ecb python: Added an optional request limiter for freethread. --- diff --git a/python3/ashd/serve.py b/python3/ashd/serve.py index 8520411..6111ec6 100644 --- a/python3/ashd/serve.py +++ b/python3/ashd/serve.py @@ -86,13 +86,28 @@ class handler(object): return {} class freethread(handler): - def __init__(self, **kw): + def __init__(self, *, max=None, **kw): super().__init__(**kw) self.current = set() self.lk = threading.Lock() + self.tcond = threading.Condition(self.lk) + self.max = max + + @classmethod + def parseargs(cls, *, max=None, **args): + ret = super().parseargs(**args) + if max: + ret["max"] = int(max) + return ret def handle(self, req): - reqthread(target=self.run, args=[req]).start() + with self.lk: + while self.max is not None and len(self.current) >= self.max: + self.tcond.wait() + th = reqthread(target=self.run, args=[req]) + th.start() + while th.is_alive() and th not in self.current: + self.tcond.wait() def ckflush(self, req): while len(req.buffer) > 0: @@ -104,6 +119,7 @@ class freethread(handler): th = threading.current_thread() with self.lk: self.current.add(th) + self.tcond.notify_all() try: env = req.mkenv() with perf.request(env) as reqevent: @@ -121,6 +137,7 @@ class freethread(handler): finally: with self.lk: self.current.remove(th) + self.tcond.notify_all() finally: req.close()