[Twisted-Python] Problems using win32eventreactor()

Dave Peticolas dave at krondo.com
Thu Feb 13 02:18:23 MST 2003


On Mon, 2003-02-10 at 20:54, Itamar Shtull-Trauring wrote:
> On Mon, 10 Feb 2003 21:01:42 -0500
> "Jeff Grimmett" <grimmtooth at softhome.net> wrote:
> 
> > This generates an error message at the win32eventreactor.install()
> > line:
> > 
> >     assert not sys.modules.has_key('twisted.internet.reactor'), \
> > AssertionError: reactor already installed
> > 
> > What am I missing?
> 
> win32eventreactor.install() should be the *first* thing in your module
> or app. It has to be run before any other code is, or someone might
> "from twisted.internet import reactor", which installs the default
> reactor.

This also confused me (and another developer new to Twisted) when
we first encountered it. You normally don't expect import order to
matter, especially for seemingly different namespaces (t.i.reactor
versus t.i.win32eventreactor, for example). I realize that
win32eventreactor.install() is messing with the modules namespace,
but you don't know that without delving deep into the code.

I've come up with a patch to eliminate the need to remember
a special import order. Since the reactor mechanism is so basic
to Twisted, I am attaching it for review rather than committing
it, although it does pass 'trial' for the default reactor and
several others.

The gtk2reactor trial is failing to even finish, but that
seems to be unrelated to this patch. Are others seeing this
behavior?

thanks,
dave

-------------- next part --------------
? bin/_trial_temp
Index: twisted/internet/default.py
===================================================================
RCS file: /cvs/Twisted/twisted/internet/default.py,v
retrieving revision 1.63
diff -u -r1.63 default.py
--- twisted/internet/default.py	3 Feb 2003 23:53:30 -0000	1.63
+++ twisted/internet/default.py	13 Feb 2003 01:13:25 -0000
@@ -500,11 +500,31 @@
         return readers
 
 
+class StubReactor:
+    """A placeholder reactor."""
+
+    realReactor = None
+
+    def installReactor(self, reactor):
+        self.realReactor = reactor
+
+    def reactorInstalled(self):
+        return self.realReactor is not None
+
+    def __getattr__(self, key):
+        if self.realReactor is None:
+            del sys.modules['twisted.internet.reactor']
+            reactor = install()
+            self.installReactor(reactor)
+        return getattr(self.realReactor, key)
+
+
 def install():
     """Configure the twisted mainloop to be run using the select() reactor.
     """
     reactor = SelectReactor(1)
     main.installReactor(reactor)
+    return reactor
 
 
-__all__ = ["install", "PosixReactorBase", "SelectReactor"]
+__all__ = ["install", "PosixReactorBase", "SelectReactor", "StubReactor"]
Index: twisted/internet/main.py
===================================================================
RCS file: /cvs/Twisted/twisted/internet/main.py,v
retrieving revision 1.86
diff -u -r1.86 main.py
--- twisted/internet/main.py	15 Oct 2002 18:32:37 -0000	1.86
+++ twisted/internet/main.py	13 Feb 2003 01:13:26 -0000
@@ -111,9 +111,14 @@
     global iterate, addTimeout, wakeUp
     # this stuff should be common to all reactors.
     import twisted.internet
+    import default
     import sys
-    assert not sys.modules.has_key('twisted.internet.reactor'), \
-           "reactor already installed"
+    if sys.modules.has_key('twisted.internet.reactor'):
+        current = sys.modules['twisted.internet.reactor']
+        assert (isinstance(current, default.StubReactor) and
+                not current.reactorInstalled()), \
+                "reactor already installed"
+        current.installReactor(reactor)
     twisted.internet.reactor = reactor
     sys.modules['twisted.internet.reactor'] = reactor
 
Index: twisted/internet/reactor.py
===================================================================
RCS file: /cvs/Twisted/twisted/internet/reactor.py,v
retrieving revision 1.4
diff -u -r1.4 reactor.py
--- twisted/internet/reactor.py	1 Sep 2002 10:41:06 -0000	1.4
+++ twisted/internet/reactor.py	13 Feb 2003 01:13:26 -0000
@@ -13,17 +13,23 @@
 # You should have received a copy of the GNU Lesser General Public
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
 """
 See twisted.internet.interfaces.IReactor*.
 """
+
 import sys
 del sys.modules['twisted.internet.reactor']
+
 from twisted.python import runtime
+
 if runtime.platform.getType() == 'java':
     from twisted.internet import javareactor
     javareactor.install()
 else:
-    #from twisted.python import log
-    #log.msg("Installing SelectReactor, since unspecified.")
+    import sys
+    import twisted.internet
     from twisted.internet import default
-    default.install()
+    reactor = default.StubReactor()
+    twisted.internet.reactor = reactor
+    sys.modules['twisted.internet.reactor'] = reactor
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: </pipermail/twisted-python/attachments/20030213/a6fd1e4f/attachment.sig>


More information about the Twisted-Python mailing list