def worker_exe( wid, comm ): wpsLog.debug( " STARTING WORKER %s EXE " % wid ) kernelMgr = KernelManager( wid ) while True: try: task_request_args = cPickle.loads( comm.recv_bytes() ) wpsLog.debug( " MULTIPROC[%s] ---> task_request_args: %s " % ( wid, str( task_request_args ) ) ) results = kernelMgr.run( TaskRequest(task=task_request_args) ) # wpsLog.debug( "\n PPT: Worker[%s] sending response-> RID: %s -----\n" % ( wid, results['rid'] ) ) comm.send_bytes( cPickle.dumps(results) ) except Exception, err: wpsLog.error( " Error executing kernel on Worker[%s] ---> %s:\n %s " % ( wid, str( err ), traceback.format_exc() ) )
import traceback from mpi4py import MPI comm = MPI.Comm.Get_parent() size = comm.Get_size() rank = comm.Get_rank() active = True wid = "W-%d"%rank rid = -1 kernelMgr = KernelManager( wid ) wpsLog.debug( " MPI[%d/%d] STARTUP WORKER '%s': process %x" % ( rank, size, wid, os.getpid() ) ) while active: status = MPI.Status() try: task_request_args = comm.recv( source=0, tag=MPI.ANY_TAG, status=status ) rid = status.Get_tag() wpsLog.debug( " MPI[%s] ---> task_request[%d]: args: %s " % ( wid, rid, str( task_request_args ) ) ) cfg = task_request_args.get('config','') if cfg == "exit": break task_request_args['rid'] = rid results = kernelMgr.run( TaskRequest(task=task_request_args) ) # wpsLog.debug( " MPI[%d/%d] WORKER SEND RESPONSE '%s': worker %s" % ( rank, size, str(results), wid ) ) comm.send( results, dest=0, tag=rid ) except Exception, err: wpsLog.error( " Error executing task_request[%d] on Worker[%s] ---> %s:\n %s " % ( rid, wid, str( err ), traceback.format_exc() ) ) comm.Disconnect()