示例#1
0
文件: async.py 项目: eejd/microasync
class CoroutineBlock(Promise):
    """Similar to go-block in core.async. Internal use only!"""

    def __init__(self, gen):
        super(CoroutineBlock, self).__init__()
        self._gen = gen
        self._last_promise = Promise()
        self._last_promise.delivery(None)
        processable.append(self)

    @property
    def parked(self):
        """Returns `True` when block parked."""
        return not self._last_promise.delivered

    def process(self):
        """Process promises returned by coroutine generator."""
        if not self.parked:
            try:
                self._last_promise = self._gen.send(self._last_promise.value)
            except StopIteration as e:
                self.delivery(e.value)
                self._close()
            except AttributeError:
                self.delivery(self._gen)
                self._close()

    def _close(self):
        """Removes self from list of active coroutine blocks."""
        processable.remove(self)
示例#2
0
文件: async.py 项目: eejd/microasync
 def __init__(self, gen):
     super(CoroutineBlock, self).__init__()
     self._gen = gen
     self._last_promise = Promise()
     self._last_promise.delivery(None)
     processable.append(self)
示例#3
0
文件: tests.py 项目: eejd/microasync
 def test_cant_be_delivered_twice(self):
     prom = Promise()
     self.assertTrue(prom.delivery(12))
     self.assertFalse(prom.delivery(52))
     self.assertEqual(prom.value, 12)
示例#4
0
文件: tests.py 项目: eejd/microasync
 def test_delivery(self):
     prom = Promise()
     self.assertTrue(prom.delivery(12))
     self.assertTrue(prom.delivered)
     self.assertEqual(prom.value, 12)