smbinterp/bin/slave.py

77 lines
1.9 KiB
Python

#!/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] <server> <gmsh file>")
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)