John noticed that my changes to show() prior to 1.0 had broken a use case with tkagg and ipython -pylab, so I fixed that yesterday in maintenance branch and trunk. Today, in 8562 and 8563, I did some refactoring to try to make show() behavior more understandable across backends, and easier to modify if necessary. Specifically, we need to work with the ipython people to make sure the ipython 0.11 refactoring of interactive support works as intended. I haven't done any testing with the development version of 0.11 yet.
At present, all interactive backends start a blocking mainloop only if ipython has not attached a _needmain flag to show(), and if mpl is not in interactive mode.
Under all script and ipython conditions, multiple calls to show in a session or script are permitted.
All interactive backends behave the same when run with ipython -pylab, version 0.10: show is non-blocking, regardless of whether it is executed on the command line (completely unnecessary) or is found in a script.
Under raw ipython (no -pylab or other threading flags provided), with mpl in non-interactive mode, all backends behave the same: show() is needed and blocks, but may be called multiple times. With mpl in interactive mode, there are two categories: tkagg, fltkagg, gtk*, and qt4agg behave the same as in -pylab mode, so there so no longer any real need for the special threading modes; but wx* and qtagg do not behave in a useful way, so they still need the special threading.
All of the above is based on quick tests with my own system, ubuntu 10.04. I expect it will be the same for other supported systems, with the exception that behavior in raw ipython mode, with mpl in interactive mode, may not work with some earlier versions of gui toolkits--but I suspect we will not actually encounter this for supported versions.
I have not built or tested anything under Windows or OS X. For the latter, testing of the macosx backend is needed. I expect cocoaagg to behave differently than the others, but no differently than it did before my changes.