<div>This isn't the best solution, but I've been using a semaphore to limit the number of "tasks" that take place at a time. I've also been doing some research on IOCP and plan on adding some missing functionality to the IOCP reactor so I don't have to use the win32eventreactor anymore.
</div>
<div> </div>
<div> </div>
<div>
<p>from twisted.internet import defer</p>
<p>class Semaphore:<br> """A semaphore for event driven systems."""<br> def __init__(self, tokens):<br> self.waiting = []<br> self.tokens = tokens<br> self.limit = tokens
</p>
<p> def acquire(self):<br> """Attempt to acquire the token.</p>
<p> @return Deferred which returns on token acquisition.<br> """<br> assert self.tokens >= 0<br> d = defer.Deferred()<br> if not self.tokens:<br> self.waiting.append
(d)<br> else:<br> self.tokens = self.tokens - 1<br> d.callback(self)<br> return d</p>
<p> def release(self):<br> """Release the token.</p>
<p> Should be called by whoever did the acquire() when the shared<br> resource is free.<br> """<br> assert self.tokens < self.limit<br> self.tokens = self.tokens + 1<br>
if self.waiting:<br> # someone is waiting to acquire token<br> self.tokens = self.tokens - 1<br> d = self.waiting.pop(0)<br> d.callback(self)</p>
<p> def _releaseAndReturn(self, r):<br> self.release()<br> return r</p>
<p> def run(self, f, *args, **kwargs):<br> """Acquire token, run function, release token.</p>
<p> @return Deferred of function result.<br> """<br> d = self.acquire()<br> d.addCallback(lambda r: defer.maybeDeferred(f, *args, **kwargs).addBoth(self._releaseAndReturn))<br> return d
<br></p></div>
<div><br><br> </div>
<div><span class="gmail_quote">On 6/28/05, <b class="gmail_sendername">Toby Dickenson</b> <<a href="mailto:tdickenson@devmail.geminidataloggers.co.uk">tdickenson@devmail.geminidataloggers.co.uk</a>> wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Im finding that Win32Reactor raises an exception on every iteration of the<br>main loop if I exceed the limit of 64 WaitForMultipleObjects.
<br><br>I would prefer to avoid this fairly obvious denial-of-service problem by<br>limiting the number of concurrent client connections. Is there a standard<br>solution for this?<br><br>Thanks in advance,<br><br>--<br>Toby Dickenson
<br><br>_______________________________________________<br>Twisted-Python mailing list<br><a href="mailto:Twisted-Python@twistedmatrix.com">Twisted-Python@twistedmatrix.com</a><br><a href="http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python">
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python</a><br></blockquote></div><br>