Exemplo n.º 1
0
    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'))
Exemplo n.º 2
0
    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()
Exemplo n.º 3
0
    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()
Exemplo n.º 4
0
    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)) )
Exemplo n.º 5
0
    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)))