#!/usr/bin/env python
import matplotlib
matplotlib.use('PDF') #NOTE: without it seqfault occures
import Queue
import logging
import math
import numpy as np
import sys
import time
import threading
from matplotlib import pyplot as plt
dbg = logging.debug
def plot_figure(queue, dqueue):
while True:
nfig = queue.get()
try:
dbg("plot %s" % nfig)
x = np.arange(nfig*math.pi/100, 5+nfig*math.pi/100, 0.1);
y = np.sin(x)
f = plt.figure(nfig)
ax = f.add_subplot(111)
ax.plot(x, y)
ax.set_title(str(nfig))
f.savefig('%s.pdf' % nfig)
plt.close(nfig)
queue.task_done()
dbg("done %s" % nfig)
finally:
dqueue.put(nfig)
def main():
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(threadName)s %(message)s')
nthreads = int(sys.argv[1]) if len(sys.argv) > 1 else 2
nfig = int(sys.argv[2]) if len(sys.argv) > 2 else 10
# start threads
fqueue = Queue.Queue()
dqueue = Queue.Queue()
threads = [threading.Thread(target=plot_figure, args=(fqueue, dqueue))
for fig in xrange(nthreads)]
dbg("start %d threads" % len(threads))
for t in threads:
t.daemon = True
t.start()
dbg("fill queue")
for fig in xrange(nfig):
fqueue.put(fig)
dbg("wait for threads")
for _ in xrange(nfig):
dqueue.get()
dbg("done")
if __name__=="__main__":
main()
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmltcG9ydCBtYXRwbG90bGliCm1hdHBsb3RsaWIudXNlKCdQREYnKSAjTk9URTogd2l0aG91dCBpdCBzZXFmYXVsdCBvY2N1cmVzCgppbXBvcnQgUXVldWUKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG1hdGgKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBzeXMKaW1wb3J0IHRpbWUKaW1wb3J0IHRocmVhZGluZwoKZnJvbSBtYXRwbG90bGliIGltcG9ydCBweXBsb3QgYXMgcGx0CgpkYmcgPSBsb2dnaW5nLmRlYnVnCgpkZWYgcGxvdF9maWd1cmUocXVldWUsIGRxdWV1ZSk6CiAgICB3aGlsZSBUcnVlOgogICAgICAgIG5maWcgPSBxdWV1ZS5nZXQoKQogICAgICAgIHRyeToKICAgICAgICAgICAgZGJnKCJwbG90ICVzIiAlIG5maWcpICAgICAgICAKICAgICAgICAgICAgeCA9IG5wLmFyYW5nZShuZmlnKm1hdGgucGkvMTAwLCA1K25maWcqbWF0aC5waS8xMDAsIDAuMSk7CiAgICAgICAgICAgIHkgPSBucC5zaW4oeCkKCiAgICAgICAgICAgIGYgPSBwbHQuZmlndXJlKG5maWcpCiAgICAgICAgICAgIGF4ID0gZi5hZGRfc3VicGxvdCgxMTEpCiAgICAgICAgICAgIGF4LnBsb3QoeCwgeSkKICAgICAgICAgICAgYXguc2V0X3RpdGxlKHN0cihuZmlnKSkKICAgICAgICAgICAgZi5zYXZlZmlnKCclcy5wZGYnICUgbmZpZykKICAgICAgICAgICAgcGx0LmNsb3NlKG5maWcpCiAgICAgICAgICAgIHF1ZXVlLnRhc2tfZG9uZSgpCiAgICAgICAgICAgIGRiZygiZG9uZSAlcyIgJSBuZmlnKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGRxdWV1ZS5wdXQobmZpZykKICAgICAgICAKZGVmIG1haW4oKToKICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoCiAgICAgICAgbGV2ZWw9bG9nZ2luZy5ERUJVRywKICAgICAgICBmb3JtYXQ9JyUoYXNjdGltZSlzICUodGhyZWFkTmFtZSlzICUobWVzc2FnZSlzJykKICAgIAogICAgbnRocmVhZHMgPSBpbnQoc3lzLmFyZ3ZbMV0pIGlmIGxlbihzeXMuYXJndikgPiAxIGVsc2UgMgogICAgbmZpZyA9IGludChzeXMuYXJndlsyXSkgaWYgbGVuKHN5cy5hcmd2KSA+IDIgZWxzZSAxMAoKICAgICMgc3RhcnQgdGhyZWFkcwogICAgZnF1ZXVlID0gUXVldWUuUXVldWUoKQogICAgZHF1ZXVlID0gUXVldWUuUXVldWUoKQogICAgdGhyZWFkcyA9IFt0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1wbG90X2ZpZ3VyZSwgYXJncz0oZnF1ZXVlLCBkcXVldWUpKQogICAgICAgICAgICAgICBmb3IgZmlnIGluIHhyYW5nZShudGhyZWFkcyldCgogICAgZGJnKCJzdGFydCAlZCB0aHJlYWRzIiAlIGxlbih0aHJlYWRzKSkKICAgIGZvciB0IGluIHRocmVhZHM6CiAgICAgICAgdC5kYWVtb24gPSBUcnVlCiAgICAgICAgdC5zdGFydCgpCgogICAgZGJnKCJmaWxsIHF1ZXVlIikKICAgIGZvciBmaWcgaW4geHJhbmdlKG5maWcpOgogICAgICAgIGZxdWV1ZS5wdXQoZmlnKQoKICAgIGRiZygid2FpdCBmb3IgdGhyZWFkcyIpCiAgICBmb3IgXyBpbiB4cmFuZ2UobmZpZyk6CiAgICAgICAgZHF1ZXVlLmdldCgpCiAgICBkYmcoImRvbmUiKQoKaWYgX19uYW1lX189PSJfX21haW5fXyI6CiAgICBtYWluKCkKICAgICAgICAK