[Twisted-Python] Two main loops

Nitro nitro at dr-code.org
Sun Nov 11 09:20:46 EST 2007


Am 11.11.2007, 15:03 Uhr, schrieb Bernie Roehl <broehl at gmail.com>:

> I've got a 3D game that I've implemented in Python using an existing
> game engine.  The engine "owns" the main loop, i.e. I call
> engine.run() and it makes callbacks to my application on every frame
> (and other game event).
>
> Now I'm adding networking, and I'd like to use Twisted.  However,
> Twisted uses the same approach as the game engine -- I call
> reactor.run() and it makes callbacks to my application.
>
> So, how do I integrate the two?
>
> My first though is to call reactor.run() in a separate thread, but of
> course that adds additional complexity in terms of synchronization.
>
> I notice the docs mention reactor.iterate(), which appears to be
> designed for exactly what I'm doing.  However, it's not clear how to
> use it, and the method appears to be deprecated.
>
> Any suggestions are appreciated...

I am using twisted with our home-brewn 3d engine and I do it like this:

def DoOneLoopIteration():
     engine.RunSingleIteration()
     reactor.callLater(0, DoOneLoopIteration)

reactor.callLater(0, DoOneLoopIteration)
reactor.run()

There are other possibilities like

import twisted.internet.task
scheduleUpdate = twisted.internet.task.LoopingCall(DoOneLoopIteration)
scheduleUpdate.start(0.01, False)   # 100 Hz

They all have in common that twisted is driving the main loop and the 3d  
part of the app only executes the inner part of it's main loop. I tried  
the opposite way before (3d part of the app driving main loop, twisted  
being run with iterate()) but this wasn't really usable.

-Matthias




More information about the Twisted-Python mailing list