Threading поможет вам тогда и только тогда, когда pylab освобождает gil во время выполнения.
Более того, pylib должен быть потокобезопасным, и ваш код должен использовать его в поточно-ориентированном режиме, и это не всегда так.
Тем не менее, если вы собираетесь использовать потоки, я думаю, что это классический случай очереди заданий; поэтому я бы использовал объект очереди , который достаточно хорош, чтобы позаботиться об этом шаблоне.
Вот пример, который я привел, просто вмешиваясь в ваш код и пример, приведенный в документации очереди. Я даже не проверил это полностью, так что в нем будут ошибки; это больше дать идею, чем что-либо еще.
# "Business" code
def do_chart(target="IMG_BACK", xlabel="xlabel", ylabel="ylabel", title="title", ydata=pylab.arange(1961, 2031, 1)):
global MYRAMDICT
MYRAMDICT = {}
print "here"
for i in range(70):
q.put(i)
q.join() # block until all tasks are done
def do_work(i):
MYRAMDICT[i] = cStringIO.StringIO()
xdata = pylab.arange(1961, 2031, 1)
pylab.figure(num=None, figsize=(10.24, 5.12), dpi=1, facecolor='w', edgecolor='k')
pylab.plot(xdata, ydata, linewidth=3.0)
pylab.xlabel(xlabel); pylab.ylabel(ylabel); pylab.title(i)
pylab.grid(True)
pylab.savefig(MYRAMDICT[i], format='png')
pylab.close()
# Handling the queue
def worker():
while True:
i = q.get()
do_work(i)
q.task_done()
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
t.start()