#!/usr/bin/env python
import logging
import multiprocessing
import math
import numpy as np
import sys
from multiprocessing import JoinableQueue as Queue, Process as Thread
from matplotlib import pyplot as plt
dbg = multiprocessing.get_logger().info
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():
logger = multiprocessing.log_to_stderr()
logger.setLevel(logging.INFO)
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()
dqueue = Queue()
threads = [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()
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBtdWx0aXByb2Nlc3NpbmcKaW1wb3J0IG1hdGgKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBzeXMKCmZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBKb2luYWJsZVF1ZXVlIGFzIFF1ZXVlLCBQcm9jZXNzIGFzIFRocmVhZApmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5cGxvdCBhcyBwbHQKCmRiZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkuaW5mbwoKZGVmIHBsb3RfZmlndXJlKHF1ZXVlLCBkcXVldWUpOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBuZmlnID0gcXVldWUuZ2V0KCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRiZygicGxvdCAlcyIgJSBuZmlnKSAgICAgICAgCiAgICAgICAgICAgIHggPSBucC5hcmFuZ2UobmZpZyptYXRoLnBpLzEwMCwgNStuZmlnKm1hdGgucGkvMTAwLCAwLjEpOwogICAgICAgICAgICB5ID0gbnAuc2luKHgpCgogICAgICAgICAgICBmID0gcGx0LmZpZ3VyZShuZmlnKQogICAgICAgICAgICBheCA9IGYuYWRkX3N1YnBsb3QoMTExKQogICAgICAgICAgICBheC5wbG90KHgsIHkpCiAgICAgICAgICAgIGF4LnNldF90aXRsZShzdHIobmZpZykpCiAgICAgICAgICAgIGYuc2F2ZWZpZygnJXMucGRmJyAlIG5maWcpCiAgICAgICAgICAgIHBsdC5jbG9zZShuZmlnKQogICAgICAgICAgICBxdWV1ZS50YXNrX2RvbmUoKQogICAgICAgICAgICBkYmcoImRvbmUgJXMiICUgbmZpZykKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBkcXVldWUucHV0KG5maWcpCiAgICAgICAgCmRlZiBtYWluKCk6CiAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcubG9nX3RvX3N0ZGVycigpCiAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQoKICAgIG50aHJlYWRzID0gaW50KHN5cy5hcmd2WzFdKSBpZiBsZW4oc3lzLmFyZ3YpID4gMSBlbHNlIDIKICAgIG5maWcgPSBpbnQoc3lzLmFyZ3ZbMl0pIGlmIGxlbihzeXMuYXJndikgPiAyIGVsc2UgMTAKCiAgICAjIHN0YXJ0IHRocmVhZHMKICAgIGZxdWV1ZSA9IFF1ZXVlKCkKICAgIGRxdWV1ZSA9IFF1ZXVlKCkKICAgIHRocmVhZHMgPSBbVGhyZWFkKHRhcmdldD1wbG90X2ZpZ3VyZSwgYXJncz0oZnF1ZXVlLCBkcXVldWUpKQogICAgICAgICAgICAgICBmb3IgZmlnIGluIHhyYW5nZShudGhyZWFkcyldCgogICAgZGJnKCJzdGFydCAlZCB0aHJlYWRzIiAlIGxlbih0aHJlYWRzKSkKICAgIGZvciB0IGluIHRocmVhZHM6CiAgICAgICAgdC5kYWVtb24gPSBUcnVlCiAgICAgICAgdC5zdGFydCgpCgogICAgZGJnKCJmaWxsIHF1ZXVlIikKICAgIGZvciBmaWcgaW4geHJhbmdlKG5maWcpOgogICAgICAgIGZxdWV1ZS5wdXQoZmlnKQoKICAgIGRiZygid2FpdCBmb3IgdGhyZWFkcyIpCiAgICBmb3IgXyBpbiB4cmFuZ2UobmZpZyk6CiAgICAgICAgZHF1ZXVlLmdldCgpCiAgICBkYmcoImRvbmUiKQoKaWYgX19uYW1lX189PSJfX21haW5fXyI6CiAgICBtYWluKCkKICAgICAgICAK