Is there a way to detach matplotlib plots so that the computation can continue?
Use matplotlib
's calls that won't block:
Using draw()
:
from matplotlib.pyplot import plot, draw, showplot([1,2,3])draw()print('continue computation')# at the end call show to ensure window won't close.show()
Using interactive mode:
from matplotlib.pyplot import plot, ion, showion() # enables interactive modeplot([1,2,3]) # result shows immediatelly (implicit draw())print('continue computation')# at the end call show to ensure window won't close.show()
Use the keyword 'block' to override the blocking behavior, e.g.
from matplotlib.pyplot import show, plotplot(1) show(block=False)# your code
to continue your code.
It is better to always check with the library you are using if it supports usage in a non-blocking way.
But if you want a more generic solution, or if there is no other way, you can run anything that blocks in a separated process by using the multprocessing
module included in python. Computation will continue:
from multiprocessing import Processfrom matplotlib.pyplot import plot, showdef plot_graph(*args): for data in args: plot(data) show()p = Process(target=plot_graph, args=([1, 2, 3],))p.start()print 'yay'print 'computation continues...'print 'that rocks.'print 'Now lets wait for the graph be closed to continue...:'p.join()
That has the overhead of launching a new process, and is sometimes harder to debug on complex scenarios, so I'd prefer the other solution (using matplotlib
's nonblocking API calls)