def call(self, *args, **kwargs): try: return self.rc.call(REF, *args, **kwargs) except EVException: p = Promise() p._smash(EVException('Server currently unavailable.')) return p
class Processround(object): def __init__(self, slaves, data, funcname, combinefunc): self.slaves = slaves self.data = data self.funcname = funcname self.combinefunc = combinefunc self.p = Promise() self.results = [] def run(self): amount = len(self.data) / len(self.slaves) for i in range(len(self.slaves)): rp = self.slaves[i].call( self.funcname, self.data[i * amount:(i * amount) + amount]) rp._when(self.resultcb) rp._except(self.exceptcb) return self.p def exceptcb(self, e): self.p._smash(e) def resultcb(self, result): self.results.append(result) if len(self.results) == len(self.slaves): self.p._resolve(self.combinefunc(self.results))
class Filestreamer(object): def __init__(self, src, dst, conn): self.src, self.dst = src, dst self.conn = conn self.done = False self.p = Promise() self.count = 0 self.burst = True conn.conn._on('writable', self.copy) conn.conn._on('close', self.closed) schedule(self.copy) def copyagain(self, r): self.burst = True schedule(self.copy) def copy(self): if self.done or self.conn.conn._closed: return if not self.burst: return self.count += 1 d = self.src.read(16384) if not d: print 'EOF on src, sending close, local close, done' p2 = self.dst.call('close') def done(r): self.p._resolve(True) self.conn.close() p2._when(done) self.done = True self.src.close() return if self.count == 10: self.burst = False self.count = 0 p = self.dst.call('write', d) p._when(self.copyagain) else: p = self.dst.notify('write', d) def closed(self, e): print 'connection closed', e if not self.done: self.p._smash('Closed, but not done, yet.')