当前位置: 首页>>代码示例>>Python>>正文


Python RoutineContainer.withException方法代码示例

本文整理汇总了Python中vlcp.event.runnable.RoutineContainer.withException方法的典型用法代码示例。如果您正苦于以下问题:Python RoutineContainer.withException方法的具体用法?Python RoutineContainer.withException怎么用?Python RoutineContainer.withException使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在vlcp.event.runnable.RoutineContainer的用法示例。


在下文中一共展示了RoutineContainer.withException方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。

示例1: TestObjectDB

# 需要导入模块: from vlcp.event.runnable import RoutineContainer [as 别名]
# 或者: from vlcp.event.runnable.RoutineContainer import withException [as 别名]
class TestObjectDB(Module):
    def __init__(self, server):
        Module.__init__(self, server)
        self.apiroutine = RoutineContainer(self.scheduler)
        self.apiroutine.main = self._main
        self.routines.append(self.apiroutine)
        self._reqid = 0
        self._ownerid = uuid1().hex
        self.createAPI(api(self.createlogicalnetwork, self.apiroutine),
                       api(self.createlogicalnetworks, self.apiroutine),
                       api(self.createphysicalnetwork, self.apiroutine),
                       api(self.createphysicalnetworks, self.apiroutine),
                       api(self.createphysicalport, self.apiroutine),
                       api(self.createphysicalports, self.apiroutine),
                       api(self.createlogicalport, self.apiroutine),
                       api(self.createlogicalports, self.apiroutine),
                       api(self.getlogicalnetworks, self.apiroutine))
        self._logger.setLevel(logging.DEBUG)
    def _monitor(self):
        update_event = DataObjectUpdateEvent.createMatcher()
        while True:
            yield (update_event,)
            self._logger.info('Database update: %r', self.apiroutine.event)
    def _dumpkeys(self, keys):
        self._reqid += 1
        reqid = ('testobjectdb', self._reqid)
        for m in callAPI(self.apiroutine, 'objectdb', 'mget', {'keys': keys, 'requestid': reqid}):
            yield m
        retobjs = self.apiroutine.retvalue
        with watch_context(keys, retobjs, reqid, self.apiroutine):
            self.apiroutine.retvalue = [dump(v) for v in retobjs]
    def _updateport(self, key):
        unload_matcher = ModuleLoadStateChanged.createMatcher(self.target, ModuleLoadStateChanged.UNLOADING)
        def updateinner():
            self._reqid += 1
            reqid = ('testobjectdb', self._reqid)
            for m in callAPI(self.apiroutine, 'objectdb', 'get', {'key': key, 'requestid': reqid}):
                yield m
            portobj = self.apiroutine.retvalue
            with watch_context([key], [portobj], reqid, self.apiroutine):
                if portobj is not None:
                    @updater
                    def write_status(portobj):
                        if portobj is None:
                            raise ValueError('Already deleted')
                        if not hasattr(portobj, 'owner'):
                            portobj.owner = self._ownerid
                            portobj.status = 'READY'
                            return [portobj]
                        else:
                            raise ValueError('Already managed')
                    try:
                        for m in callAPI(self.apiroutine, 'objectdb', 'transact', {'keys': [portobj.getkey()], 'updater': write_status}):
                            yield m
                    except ValueError:
                        pass
                    else:
                        for m in portobj.waitif(self.apiroutine, lambda x: x.isdeleted() or hasattr(x, 'owner')):
                            yield m
                        self._logger.info('Port managed: %r', dump(portobj))
                        while True:
                            for m in portobj.waitif(self.apiroutine, lambda x: True, True):
                                yield m
                            if portobj.isdeleted():
                                self._logger.info('Port deleted: %r', dump(portobj))
                                break
                            else:
                                self._logger.info('Port updated: %r', dump(portobj))
        try:
            for m in self.apiroutine.withException(updateinner(), unload_matcher):
                yield m
        except RoutineException:
            pass
    def _waitforchange(self, key):
        for m in callAPI(self.apiroutine, 'objectdb', 'watch', {'key': key, 'requestid': 'testobjectdb'}):
            yield m
        setobj = self.apiroutine.retvalue
        with watch_context([key], [setobj], 'testobjectdb', self.apiroutine):
            for m in setobj.wait(self.apiroutine):
                yield m
            oldset = set()
            while True:
                for weakref in setobj.set.dataset().difference(oldset):
                    self.apiroutine.subroutine(self._updateport(weakref.getkey()))
                oldset = set(setobj.set.dataset())
                for m in setobj.waitif(self.apiroutine, lambda x: not x.isdeleted(), True):
                    yield m
    def _main(self):
        routines = []
        routines.append(self._monitor())
        keys = [LogicalPortSet.default_key(), PhysicalPortSet.default_key()]
        for k in keys:
            routines.append(self._waitforchange(k))
        for m in self.apiroutine.executeAll(routines, retnames = ()):
            yield m
    def load(self, container):
        @updater
        def initialize(phynetset, lognetset, logportset, phyportset):
            if phynetset is None:
                phynetset = PhysicalNetworkSet()
#.........这里部分代码省略.........
开发者ID:dq5070410,项目名称:vlcp,代码行数:103,代码来源:testobjectdb.py


注:本文中的vlcp.event.runnable.RoutineContainer.withException方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。