#!/usr/bin/env python import sys import time from multiprocessing.managers import BaseManager from optparse import OptionParser import datetime import numpy as np import interp.bootstrap from interp.grid.gmsh import ggrid from interp.tools import baker_exact_3D as exact class QueueManager(BaseManager): pass QueueManager.register('get_inqueue' ) QueueManager.register('get_outqueue') def work(inq, outq, g, myname): # print "%s about to send my name: %s" % (datetime.datetime.now(), myname) outq.put((myname, "ready")) while True: i, o, e, X = inq.get() if i == None: shutdown = o return shutdown a = g.run_baker(X, order = o, extra_points = e) outq.put((i, myname, a['qlin'], a['error'], a['final'], exact(X))) if __name__ == '__main__': parser = OptionParser(usage = "usage: %s [options] ") parser.add_option('-l', '--label', type="str", dest="label", default='jane', help="specify this slave's response label (default: %default)") parser.add_option('-p', '--port', type="int", dest="port", default=6666, help="specify the port to use on the server (default: %default)") (options, args) = parser.parse_args() if len(args) != 2: parser.print_usage() sys.exit(1) server, input_file = args m = QueueManager(address=(server, options.port), authkey='asdf') m.connect() inq = m.get_inqueue() outq = m.get_outqueue() g = ggrid(input_file) g.q = np.array([exact(x) for x in g.verts]) myname = options.label shutdown = False while not shutdown: # this sleep prevents a race condition in work(): someone putting # themselves in as ready, pulling someone elses's shutdown signal, then # putting their name in again. time.sleep(5) shutdown = work(inq, outq, g, myname)