コード例 #1
0
 def f():
     try:
         raise ValueError('fun')
     except:
         exc_info = sys.exc_info()
         greenlet(h).switch()
         self.assertEqual(exc_info, sys.exc_info())
コード例 #2
0
 def f():
     g1 = greenlet(fmain)
     g1.switch(seen)
     someref.append(g1)
     del g1
     gc.collect()
     lock.release()
     lock2.acquire()
     greenlet()  # trigger release
     lock.release()
     lock2.acquire()
コード例 #3
0
 def test_exception(self):
     seen = []
     g1 = greenlet(fmain)
     g2 = greenlet(fmain)
     g1.switch(seen)
     g2.switch(seen)
     g2.parent = g1
     self.assertEqual(seen, [])
     self.assertRaises(SomeError, g2.switch)
     self.assertEqual(seen, [SomeError])
     g2.switch()
     self.assertEqual(seen, [SomeError])
コード例 #4
0
 def test_dealloc(self):
     seen = []
     g1 = greenlet(fmain)
     g2 = greenlet(fmain)
     g1.switch(seen)
     g2.switch(seen)
     self.assertEqual(seen, [])
     del g1
     gc.collect()
     self.assertEqual(seen, [greenlet.GreenletExit])
     del g2
     gc.collect()
     self.assertEqual(seen, [greenlet.GreenletExit, greenlet.GreenletExit])
コード例 #5
0
    def test_exc_state(self):
        def f():
            try:
                raise ValueError('fun')
            except:
                exc_info = sys.exc_info()
                greenlet(h).switch()
                self.assertEqual(exc_info, sys.exc_info())

        def h():
            self.assertEqual(sys.exc_info(), (None, None, None))

        greenlet(f).switch()
コード例 #6
0
def send_exception(g, exc):
    # note: send_exception(g, exc)  can be now done with  g.throw(exc).
    # the purpose of this test is to explicitely check the propagation rules.
    def crasher(exc):
        raise exc

    g1 = greenlet(crasher, parent=g)
    g1.switch(exc)
コード例 #7
0
    def test_switch_kwargs_to_parent(self):
        def foo(x):
            greenlet.getcurrent().parent.switch(x=x)
            greenlet.getcurrent().parent.switch(2, x=3)
            return x, x**2

        g = greenlet(foo)
        self.assertEqual({'x': 3}, g.switch(3))
        self.assertEqual(((2, ), {'x': 3}), g.switch())
        self.assertEqual((3, 9), g.switch())
コード例 #8
0
    def test_two_children(self):
        lst = []

        def f():
            lst.append(1)
            greenlet.getcurrent().parent.switch()
            lst.extend([1, 1])

        g = greenlet(f)
        h = greenlet(f)
        g.switch()
        self.assertEqual(len(lst), 1)
        h.switch()
        self.assertEqual(len(lst), 2)
        h.switch()
        self.assertEqual(len(lst), 4)
        self.assertEqual(h.dead, True)
        g.switch()
        self.assertEqual(len(lst), 6)
        self.assertEqual(g.dead, True)
コード例 #9
0
    def test_simple(self):
        lst = []

        def f():
            lst.append(1)
            greenlet.getcurrent().parent.switch()
            lst.append(3)

        g = greenlet(f)
        lst.append(0)
        g.switch()
        lst.append(2)
        g.switch()
        lst.append(4)
        self.assertEqual(lst, list(range(5)))
コード例 #10
0
    def test_frame(self):
        def f1():
            f = sys._getframe(0)
            # disable this test, our fake greenlets are bootstrapped by higher level functions
            # self.assertEqual(f.f_back, None)
            greenlet.getcurrent().parent.switch(f)
            return "meaning of life"

        g = greenlet(f1)
        frame = g.switch()
        self.assertTrue(frame is g.gr_frame)
        self.assertTrue(g)
        next = g.switch()
        self.assertFalse(g)
        self.assertEqual(next, 'meaning of life')
        self.assertEqual(g.gr_frame, None)
コード例 #11
0
    def test_two_recursive_children(self):
        lst = []

        def f():
            lst.append(1)
            greenlet.getcurrent().parent.switch()

        def g():
            lst.append(1)
            g = greenlet(f)
            g.switch()
            lst.append(1)

        g = greenlet(g)
        g.switch()
        self.assertEqual(len(lst), 3)
        self.assertEqual(sys.getrefcount(g), 2)
コード例 #12
0
 def g():
     lst.append(1)
     g = greenlet(f)
     g.switch()
     lst.append(1)
コード例 #13
0
 def test_run_equals_None(self):
     g = greenlet(run=None)
コード例 #14
0
 def test_parent_equals_None(self):
     g = greenlet(parent=None)
コード例 #15
0
 def test_send_exception(self):
     seen = []
     g1 = greenlet(fmain)
     g1.switch(seen)
     self.assertRaises(KeyError, send_exception, g1, KeyError)
     self.assertEqual(seen, [KeyError])
コード例 #16
0
 def foo():
     data['g'] = greenlet(lambda: None)
     created_event.set()
     done_event.wait()
コード例 #17
0
    def test_switch_kwargs(self):
        def foo(a, b):
            self.assertEqual(a, 4)
            self.assertEqual(b, 2)

        greenlet(foo).switch(a=4, b=2)
コード例 #18
0
 def runner(x):
     g = greenlet(lambda: sleep(x))
     g.switch()