On Tue, Nov 1, 2011 at 6:48 PM, Glyph <gl...@twistedmatrix.com> wrote:
> On Nov 1, 2011, at 12:14 PM, Phil Mayers wrote:
>
>> On 01/11/11 15:28, Christopher Armstrong wrote:
>>
>>> I whole-heartedly agree with the sentiment, though. We need to get rid
>>> of the global reactor.
>>
>> Why?
>
> Sometimes you want a different reactor.  The most common reason is unit 
> testing, although if we could successfully eliminate the global reactor 
> everywhere, there are other things that we might be able to do: slowing down 
> or speeding up time from a protocol's perspective (by replacing 
> IReactorTime), grouping related objects together in reactors that can be shut 
> down together (so that reactor.stop() doesn't actually end the process); or, 
> similarly, suspending a group of related objects 
> (removeReader()/removeWriter() on everything) so that they can be inspected 
> for debugging purposes, without suspending the thing doing the inspecting (a 
> manhole python prompt).
>
>> I find the "pass reactor as 1st argument to everything" API pattern
>> messy. I'm sure there's a good reason. What is it?
>
> This pattern is a solution to the problem, but I agree that it is possibly 
> not the optimal solution.  It sort of points in a direction where every 
> possible module that might be imported becomes an argument to your function.  
> After all, there are plenty of other modules which have to be mocked for 
> testing, why not just make everyone's __init__ method take sys.modules as an 
> argument too, and never import anything?  In more complex systems this can 
> definitely turn into a bit of a mess.
>
> Nevertheless, "real reactor as default argument" is not a huge improvement 
> either, because it typically breaks one level out.  If you have 
> 'a(reactor=defaultReactor)' and then 'b()' needs to call 'a', half the time 
> 'b' will forget to supply a reactor argument and call 'a()' passing nothing, 
> because that appears to be the suggested API.   Any code that calls 'b()' 
> then needs to deal with the fact that the global reactor is going to get 
> used, even if it has a cleanly encapsulated parameter of its own.  With 
> sufficient discipline, of course, this approach is equivalent.
...
> If you can think of a better solution that addresses all of these concerns 
> simultaneously somehow, please share, I'd love to hear it :-).

reactor = getUtility(IReactor)?

jml

_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to