#!/usr/bin/env python import sys import os 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 try: a = g.run_baker(X, order = o, extra_points = e) outq.put((i, myname, a['qlin'], a['error'], a['final'], exact(X))) except Exception as e: print X, e outq.put((i, myname, 0.0, 0.0, 0.0, 0.0)) 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 = "%s-%d" % (os.uname()[1], os.getpid()) 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)