[Twisted-Python] Global reactor unit tests in the Twisted test suite

Corbin Simpson mostawesomedude at gmail.com
Tue Nov 1 13:23:05 EDT 2011


On Tue, Nov 1, 2011 at 10:06 AM, Phil Mayers <p.mayers at imperial.ac.uk> wrote:
> On 01/11/11 16:58, Itamar Turner-Trauring wrote:
>>> I find the "pass reactor as 1st argument to everything" API pattern
>>> messy. I'm sure there's a good reason. What is it?
>>
>> 1. Supporting multiple reactors.
>
> Interesting. I had assumed that was a "never on the cards" option. Would
> it be possible to "nest" the reactors, or would they have to run in
> separate threads? Or is this speculative?
>
>>
>> 2. Unit testing: if you have an explicit object, you can replace it more
>> easily with a fake.
>
> Ok. I realise it's a bit late in the day at this point, but I do wonder
> if something like:
>
> def method(arg, reactor=DefaultReactor):
>   ...
>
> ...with DefaultReactor being some kind of lazy singleton or weak
> reference might not have been a more friendly pattern to API users.
>
> As it is, I might bind a keystroke to "reactor, " ;o)

Singletons are an anti-pattern. Because the reactor is a singleton:

* We can't have multiple reactors instantiated
* We can't restart reactors
* We can't isolate certain reactor-dependent unit tests
* We have to install reactors, which requires careful ordering of imports

In Bravo, Exocet is used to set up a pseudo-sandbox. If reactor were
not a singleton, I could isolate people's usage of Twisted calls, and
force them to proxy everything. Instead, I have to grant them access
to the reactor, because it's shared global state. Is this horribly
important? No, but it does prohibit more effective sandboxing and
isolation.

Exocet needs to keep a list of modules which are so fucked that they
must be allowed to touch sys.modules to work correctly. There are two
things in that list: os.path and twisted.internet.reactor. Also, the
reactor only works if it's imported before Exocet. While Exocet's not
exactly a bastion of sanity, this doesn't speak well of the magic that
the reactor goes through in order to advertise itself globally.

Those are my reasons. They're not superb reasons from a
getting-shit-done point of view, but from a reducing-cyclopean-horrors
point of view, I think they're worth considering.

~ C.

-- 
When the facts change, I change my mind. What do you do, sir? ~ Keynes

Corbin Simpson
<MostAwesomeDude at gmail.com>



More information about the Twisted-Python mailing list