[Twisted-Python] Re: Synchronization techniques
Stefan Rank
list-ener at strank.info
Fri Apr 6 12:18:00 MDT 2007
on 04.04.2007 23:40 glyph at divmod.com said the following:
<snip>
>
> Run "python -m twisted/conch/stdio" for an example of an interactive
> session that is held in a non-blocking way. Not blocking in the code
> *doesn't* mean not blocking for the user - it just means having the
> option not to block.
>
> >2. Users expect certain things in an interactive python session that
> >don't mesh well with Twisted and the asynchronous universe:
>
> This is _exactly_ the documentation issue I was talking about :).
>
> >>>>psi = computeWavefunctionForHydrogen()
> >>>>psi.getEnergy(1)
> >-13.6
> ># here the user looks at the energy (a human if statement) and decides
> >if they actually want to
> ># make the following plot. If the answer were not -13.6, they would
> >not make the plot.
> >>>>plot(psi.getState(1))
> >
> >Even if you could get the reactor running in an interactive python
> >session it would be crazy to have to write something like (in an
> >interactive session):
> >>>>d = computeWavefunctionForHydrogen()
> >>>>def printAndPlot(psi, n):
> >>>> print psi.getEnergy(n)
> >>>> if abs(psi.getEnergy(n) - (psi.getEnergy(n)) < 1.0e-4:
> >>>> plot(psi.getState(n))
> >>>>d.addCallback(printAndPlot, 1)
>
> Here's a screenshot of an interactive session using the command above:
>
> http://twistedmatrix.com/users/glyph/images/content/screenshots/psi-energy.png
>
> Unfortunately it doesn't animate, but there is a 1-second pause between
> "<Deferred #0>" and "Deferred #0 called back:". It's a bit crude since
> it is "deferred-oriented" right now, rather than result oriented, but a
> few clever implementation tricks could easily eliminate the distinction
> (like the "_.result" line).
Am I right that this is a screenshot of the manhole client?
I just recently tried to embed the IPython shell into a twisted application.
AFAIK this is currently only possible using a separate thread
(there is an ASPN cookbook entry).
I would like to list here what I think is necessary to make this
possible without using threads. Hopefully, you can correct me where I am
wrong.
The main IPython class has a main loop (InteractiveShell.interact) that
uses raw_input. Further, it first sets up pyreadline for handling
command-line niceties inside raw_input.
For embedding this in twisted, the twisted reactor needs to be the one
calling IPython/pyreadline when necessary.
On the IPython level, I think this should be "easy" by subclassing the
Shell and splitting/rearranging the relevant code, so that it can be
called back at the point where raw_input would normally return.
(I did not look at the new IPython saw branch...)
On the twisted side, I think that something like twisted.internet.stdio
would be calling back?
Or rather something like twisted.conch.insults?
I suspect that it would be hard to recode pyreadline in a way that it
could be called back by twisted?
So to get readline support, something like readline would need to be
implemented using t.i.stdio / insults.
Does this seem possible, so far? :-)
cheers,
stefan
More information about the Twisted-Python
mailing list