def __init__(self, connection, initialkeys = (), requestid = None, logger = None):
        """
        Retrieve data objects from ObjectDB and use them to generate flows
        
        The module starts ObjectDB.walk from initial keys and walkers. After the
        walk completes, the retrieved data objects are used by `updateflow()` to
        generate flows and send them to the OpenFlow connection. When the retrieved
        objects are updated, FlowUpdater either restart the walk process (re-walk)
        or directly call another `updateflow()`, according to the objects that are updated.
        
        A subclass should re-initialize `self._initialkeys` and `self._walkerdict`
        before `main()` coroutine starts to customize the process.
        
        `updateflow()` is guaranteed for no re-entrance i.e. will not be called until
        the last call returns. Multiple changes may be merged into the same call.
        
        :param connection: OpenFlow connection
        
        :param initialkeys: DEPRECATED The key list that triggers a re-walk
        
        :param requestid: request id to retrieve data objects from ObjectDB
        
        :param logger: inherit a logger from a module
        """
        RoutineContainer.__init__(self, connection.scheduler)
        # When keys in this sequence are updated, start re-walk
        self._initialkeys = initialkeys
        self._connection = connection
        # Walker dict, will be re-initialized by a subclass
        self._walkerdict = {}
        # Walk result
        self._savedkeys = ()
        self._savedresult = []
        # Update notification (with a cache for synchronize)
        self._updatedset = set()
        self._updatedset2 = set()
        if not logger:
            self._logger = logging.getLogger(__name__ + '.FlowUpdater')
        else:
            self._logger = logger
        if requestid is None:
            self._requstid = str(uuid1())
        else:
            self._requstid = requestid
        self._requestindex = 0
        # Detect data object updates
        self._dataupdateroutine = None
        # Calling updateflow() in the same routine to prevent a re-entrance
        self._flowupdateroutine = None
def __init__ ( self , connection , initialkeys = ( ) , requestid = None , logger = None ) : RoutineContainer . __init__ ( self , connection . scheduler ) self . _initialkeys = initialkeys self . _connection = connection self . _walkerdict = { } self . _savedkeys = ( ) self . _savedresult = [ ] self . _updatedset = set ( ) self . _updatedset2 = set ( ) if not logger : self . _logger = logging . getLogger ( __name__ + '.FlowUpdater' ) else : self . _logger = logger if requestid is None : self . _requstid = str ( uuid1 ( ) ) else : self . _requstid = requestid self . _requestindex = 0 self . _dataupdateroutine = None self . _flowupdateroutine = None
Retrieve data objects from ObjectDB and use them to generate flows
        
        The module starts ObjectDB.walk from initial keys and walkers. After the
        walk completes, the retrieved data objects are used by `updateflow()` to
        generate flows and send them to the OpenFlow connection. When the retrieved
        objects are updated, FlowUpdater either restart the walk process (re-walk)
        or directly call another `updateflow()`, according to the objects that are updated.
        
        A subclass should re-initialize `self._initialkeys` and `self._walkerdict`
        before `main()` coroutine starts to customize the process.
        
        `updateflow()` is guaranteed for no re-entrance i.e. will not be called until
        the last call returns. Multiple changes may be merged into the same call.
        
        :param connection: OpenFlow connection
        
        :param initialkeys: DEPRECATED The key list that triggers a re-walk
        
        :param requestid: request id to retrieve data objects from ObjectDB
        
        :param logger: inherit a logger from a module