def test_threads_scope(self): class Foo: def bar(self): return 'baz' with s_threads.ScopeLocal(foo=Foo()): foo = s_threads.local('foo') self.assertEqual(foo.bar(), 'baz') self.assertIsNone(s_threads.local('foo'))
def test_async_wait_syntimeout(self): def longtime(): time.sleep(0.1) boss = s_async.Boss() boss.runBossPool(1) jid = s_async.jobid() task = s_async.newtask(longtime) boss.initJob(jid, task=task) with s_threads.ScopeLocal(syntimeout=0.01): self.assertFalse(boss.wait(jid)) self.assertTrue(boss.wait(jid, timeout=1)) boss.fini()
def test_telepath_push(self): # override default timeout=None for tests with s_threads.ScopeLocal(syntimeout=5): env = self.getFooEnv() port = env.link[1].get('port') prox0 = s_telepath.openurl('tcp://127.0.0.1/', port=port) prox0.push('foo1', Foo()) prox1 = s_telepath.openurl('tcp://127.0.0.1/foo1', port=port) self.eq(prox1.bar(10, 20), 30) prox0.fini() self.assertRaises(s_async.JobErr, prox1.bar, 10, 20) prox1.fini() env.fini()
def _onTeleCallMesg(self, sock, mesg): # tele:call - call a method on a shared object jid = mesg[1].get('jid') sid = mesg[1].get('sid') perm = sock.get('perm') with s_threads.ScopeLocal(perm=perm, dmon=self, sock=sock): try: name = mesg[1].get('name') item = self.shared.get(name) if item == None: # is it a pushed object? pushsock = self.pushed.get(name) if pushsock != None: # pass along how to reply mesg[1]['suid'] = sock.iden return pushsock.tx( mesg ) raise NoSuchObj(name) task = mesg[1].get('task') meth,args,kwargs = task func = getattr(item,meth,None) if func == None: raise NoSuchMeth(meth) ret = func(*args,**kwargs) # handle generator returns specially if isinstance(ret,types.GeneratorType): iden = guid() txwait = threading.Event() # start off set... txwait.set() self._dmon_yields.add(iden) sock.tx( tufo('tele:yield:init', jid=jid, iden=iden) ) # FIXME opt maxsize = 100000000 def ontxsize(m): size = m[1].get('size') if size >= maxsize: txwait.clear() else: txwait.set() try: sock.onfini( txwait.set, weak=True ) sock.on('sock:tx:size', ontxsize, weak=True) for item in ret: txwait.wait() # check if we woke due to fini if sock.isfini: break sock.tx( tufo('tele:yield:item', iden=iden, item=item) ) if iden not in self._dmon_yields: break finally: self._dmon_yields.discard(iden) sock.tx( tufo('tele:yield:fini', iden=iden) ) return sock.tx( tufo('job:done', jid=jid, ret=ret) ) except Exception as e: sock.tx( tufo('job:done', jid=jid, **excinfo(e)) )
def _onTeleCallMesg(self, sock, mesg): # tele:call - call a method on a shared object jid = mesg[1].get('jid') sid = mesg[1].get('sid') perm = sock.get('perm') with s_threads.ScopeLocal(perm=perm, dmon=self, sock=sock): try: name = mesg[1].get('name') item = self.shared.get(name) if item == None: # is it a pushed object? pushsock = self.pushed.get(name) if pushsock != None: # pass along how to reply mesg[1]['suid'] = sock.iden return pushsock.tx(mesg) raise NoSuchObj(name) task = mesg[1].get('task') meth, args, kwargs = task func = getattr(item, meth, None) if func == None: raise NoSuchMeth(meth) iden = guid() self._dmon_yields.add(iden) sock.tx(tufo('tele:yield:init', jid=jid, iden=iden)) try: for item in func(*args, **kwargs): sock.tx( tufo('tele:yield:item', iden=iden, item=item)) if iden not in self._dmon_yields: break finally: self._dmon_yields.discard(iden) sock.tx(tufo('tele:yield:fini', iden=iden)) return ret = func(*args, **kwargs) # handle generator returns specially if isinstance(ret, types.GeneratorType): iden = guid() self._dmon_yields.add(iden) sock.tx(tufo('tele:yield:init', jid=jid, iden=iden)) try: for item in ret: sock.tx( tufo('tele:yield:item', iden=iden, item=item)) if iden not in self._dmon_yields: break finally: self._dmon_yields.discard(iden) sock.tx(tufo('tele:yield:fini', iden=iden)) return sock.tx(tufo('job:done', jid=jid, ret=ret)) except Exception as e: sock.tx(tufo('job:done', jid=jid, **excinfo(e)))