##// END OF EJS Templates
split pendingresult and remotefunction into own files, add view.map.
split pendingresult and remotefunction into own files, add view.map.

File last commit:

r3588:44e6eb1e
r3588:44e6eb1e
Show More
pendingresult.py
75 lines | 2.4 KiB | text/x-python | PythonLexer
"""PendingResult objects for the client"""
#-----------------------------------------------------------------------------
# Copyright (C) 2010 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import error
#-----------------------------------------------------------------------------
# Classes
#-----------------------------------------------------------------------------
class PendingResult(object):
"""Class for representing results of non-blocking calls."""
def __init__(self, client, msg_ids):
self.client = client
self.msg_ids = msg_ids
self._result = None
self.done = False
def __repr__(self):
if self.done:
return "<%s: finished>"%(self.__class__.__name__)
else:
return "<%s: %r>"%(self.__class__.__name__,self.msg_ids)
@property
def result(self):
if self._result is not None:
return self._result
if not self.done:
self.wait(0)
if self.done:
results = map(self.client.results.get, self.msg_ids)
results = error.collect_exceptions(results, 'get_result')
self._result = self.reconstruct_result(results)
return self._result
else:
raise error.ResultNotCompleted
def reconstruct_result(self, res):
"""
Override me in subclasses for turning a list of results
into the expected form.
"""
if len(res) == 1:
return res[0]
else:
return res
def wait(self, timout=-1):
self.done = self.client.barrier(self.msg_ids)
return self.done
class PendingMapResult(PendingResult):
"""Class for representing results of non-blocking gathers.
This will properly reconstruct the gather.
"""
def __init__(self, client, msg_ids, mapObject):
self.mapObject = mapObject
PendingResult.__init__(self, client, msg_ids)
def reconstruct_result(self, res):
"""Perform the gather on the actual results."""
return self.mapObject.joinPartitions(res)