[Twisted-Python] Twisted, wxPython & PyPubSub
Gabriel Rossetti
gabriel.rossetti at arimaz.com
Fri Sep 11 06:58:48 MDT 2009
exarkun at twistedmatrix.com wrote:
> On 01:47 pm, gabriel.rossetti at arimaz.com wrote:
>
>> exarkun at twistedmatrix.com wrote:
>>
>>> On 9 Sep, 07:12 am, gabriel.rossetti at arimaz.com wrote:
>>>
>>>> exarkun at twistedmatrix.com wrote:
>>>>
>>>>> On 02:21 pm, gabriel.rossetti at arimaz.com wrote:
>>>>>
>>>>>> Hello everyone,
>>>>>>
>>>>>> I am using wx with twisted and pubsub (not the on in wx but the
>>>>>> independent one) to notify each one of what is going on. I was
>>>>>> wondering
>>>>>> if I should use reactor.callFromThread to call
>>>>>> publisher.sendMessage
>>>>>> or
>>>>>> not? I haven't been doing that until now but I wondered if it was
>>>>>> better to.
>>>>>>
>>>>> Use reactor.callFromThread if you have code running in a non-reactor
>>>>> thread and you want it to initiate some action in the reactor
>>>>> thread.
>>>>>
>>>>> So, if publisher.sendMessage is using Twisted APIs or otherwise
>>>>> requires
>>>>> that it be run only in the reactor thread, and you need to use it
>>>>> from
>>>>> a
>>>>> non-reactor thread, then use reactor.callFromThread. Otherwise,
>>>>> don't.
>>>>>
>>>>> Jean-Paul
>>>>>
>>>> Would you consider the wxreactor like a non-reactor thread?
>>>>
>>> I'm not sure what you mean. The "reactor thread" is the thread that
>>> "reactor.run()" is called in. Even if you're using wxreactor.
>>>
>>>> I haven't
>>>> checked out the code behind PyPubSub, but it's basically the
>>>> Observer-Pattern so when I call publisher.sendMessage(...) it
>>>> iterates
>>>> the "subscribers" (observers) and calls the functions they associated
>>>> w/
>>>> the subscription. Those functions are both in the twisted code and
>>>> the
>>>> wx code. The Twisted code sends messages nd the wx code brings-
>>>> up/hides
>>>> dialogs or frames. In the wxdemo it does :
>>>>
>>>> # look, we can use twisted calls!
>>>> reactor.callLater(2, self.twoSecondsPassed)
>>>>
>>>> but doesn't use reactor.callFromThread, but unless I'm wrong
>>>> reactor.callLater does the same thing but deferred in time. I often
>>>> see
>>>> reactor.callLater(0, myFunc) being used.
>>>>
>>> The wx demo doesn't do anything with threads, so it doesn't need to
>>> use
>>> callFromThread. So, if you're only doing things like what the wx demo
>>> does, you probably don't need callFromThread either.
>>>
>>> callLater doesn't do the same thing as callFromThread. There might be
>>> some vague similarities (really the only one is that neither one calls
>>> the function you pass it right away), but they're for very different
>>> things.
>>>
>>> Jean-Paul
>>>
>> Ok, well, from looking into the twisted source, it looks like the wx
>> main loop is run in a seperate thread
>> (http://twistedmatrix.com/trac/browser/tags/releases/twisted-8.1.0/twisted/internet/wxreactor.py#L60).
>>
>
> That's an implementation detail. You've also misinterpreted it
> slightly. The wx main loop is run in the same thread reactor.run() is
> called in. The other thread is used for other things.
>
> Jean-Paul
>
>
Ok, thanks for the clarification, so if I understand correctly then I
can make wx calls (like self.factory.myFrame.Show()) from twisted just
like if it was 100% twisted, and make twisted calls (like
self.txClient.transport.write()) from wx just like if it was 100% wx?
Cool :-)
Gabriel
More information about the Twisted-Python
mailing list