Exemplo n.º 1
0
def __create_remote_Conc__(Mgr, RemoteEnvId, CallingModule, ConcClass, *args,
                           **kwargs):
    ''' low-level support for Conc creation in another Env '''

    ConcId = _ConcIdMgr.new()
    NewConcAddr = ConcAddr(my_EnvId(), ConcId, RemoteEnvId)

    ConcClassProxy = proxy(ConcClass, ConcClass.__name__ + 'Name',
                           CallingModule)
    NewProxy = ConcClassProxy(NewConcAddr)
    NewName = Name(NewProxy, ConcClass.__name__, CallingModule.__name__)

    # create proxy for remote Env
    EnvConcAddr = ConcAddr(CORPSMGR_ENVID, ENVMGR_CONCID, RemoteEnvId)
    RemoteEnv = EnvName(EnvConcAddr)

    # request object creation in remote Env
    kwargs['ConcAddr'] = NewConcAddr
    kwargs['Mgr'] = Mgr

    FutRes = RemoteEnv.rem2loc_create_Conc(NewConcAddr, CallingModule.__name__,
                                           ConcClass.__name__, *args, **kwargs)

    try:
        Ret = FutRes.Ret

    except:
        ei = exc_info()
        ftb = format_exception(ei[0], ei[1], ei[2])
        raise AsyncExecutionError(ei[0].__name__, ei[1], ''.join(ftb))

    return NewName
Exemplo n.º 2
0
    def my_Name(self):
        frm = stack()[1]
        CallingModule = getmodule(frm[0])

        SelfClassName = self.__class__.__name__
        ConcClassProxy = proxy(self.__class__, SelfClassName + 'Name', CallingModule)

        NewProxy = ConcClassProxy(self.ConcAddr)
        NewName = Name(NewProxy, SelfClassName, CallingModule.__name__)
        return NewName
Exemplo n.º 3
0
    def __init__(cls, name, bases, dct):
        super(ConcMeta, cls).__init__(name, bases, dct)

        #print(f'\nmetaclass init: {name} inherits from mro: {cls.mro()}\n')

        # generate a Name (i.e. a proxy) for the Conc subclass (except Name itself) in the calling module
        mro = cls.mro()
        if mro[0].__module__ != 'Name':
            frm = stack()[1]
            CallingModule = getmodule(frm[0])
            ClassProxy = proxy(cls, mro[0].__name__ + 'Name', CallingModule)
Exemplo n.º 4
0
    def my_Name(self):
        ''' Returns a new Name for the Conc instance '''

        SelfClassName = self.__class__.__name__
        CallingModuleName = self.__class__.__module__
        CallingModule = import_module(CallingModuleName)

        ConcClassProxy = proxy(self.__class__, SelfClassName + 'Name', CallingModule)

        NewProxy = ConcClassProxy(self.ConcAddr)
        NewName = Name(NewProxy, SelfClassName, CallingModuleName)
        return NewName
Exemplo n.º 5
0
    def my_ExtName(self):
        ''' Returns a new ExtName for the Corps instance '''

        # todo: after we implement to_ExtName(), maybe rewrite using Conc's verion and converting

        SelfClassName = self.__class__.__name__
        CallingModuleName = self.__class__.__module__
        CallingModule = import_module(CallingModuleName)

        CorpsClassProxy = proxy(self.__class__, SelfClassName + 'Name', CallingModule)

        NewProxy = CorpsClassProxy(ConcAddr_to_ExtAddr(self.ConcAddr, my_Ip(), my_Port()))
        NewName = Name(NewProxy, SelfClassName, CallingModuleName)
        return NewName
Exemplo n.º 6
0
def __create_local_Conc(Mgr, CallingModule, ConcClass, *args, **kwargs):
    ''' low-level support for Conc creation in this Env '''

    ConcId = _ConcIdMgr.new()
    NewConcAddr = ConcAddr(my_EnvId(), ConcId, my_EnvId())

    ConcClassProxy = proxy(ConcClass, ConcClass.__name__ + 'Name',
                           CallingModule)
    NewProxy = ConcClassProxy(NewConcAddr)
    NewName = Name(NewProxy, ConcClass.__name__, CallingModule.__name__)

    ConcClassInModule = getattr(CallingModule, ConcClass.__name__)

    kwargs['ConcAddr'] = NewConcAddr
    NewConc = ConcClassInModule(*args, **kwargs)

    _Addr2Conc.register(NewConc, NewConcAddr)

    return NewName
Exemplo n.º 7
0
def __create_remote_Conc(Mgr, RemoteEnvId, CallingModule, ConcClass, *args,
                         **kwargs):
    ''' low-level support for Conc creation in another Env '''

    ConcId = _ConcIdMgr.new()
    NewConcAddr = ConcAddr(my_EnvId(), ConcId, RemoteEnvId)

    ConcClassProxy = proxy(ConcClass, ConcClass.__name__ + 'Name',
                           CallingModule)
    NewProxy = ConcClassProxy(NewConcAddr)
    NewName = Name(NewProxy, ConcClass.__name__, CallingModule.__name__)

    # create proxy for remote Env
    EnvConcAddr = ConcAddr(CORPSMGR_ENVID, ENVMGR_CONCID, RemoteEnvId)
    RemoteEnv = EnvName(EnvConcAddr)

    # call rem2loc_create_Conc
    kwargs['ConcAddr'] = NewConcAddr
    FutRes = RemoteEnv.rem2loc_create_Conc(NewConcAddr, CallingModule.__name__,
                                           ConcClass.__name__, *args, **kwargs)
    Ret = FutRes.Ret

    return NewName
Exemplo n.º 8
0
def load_Corps(ConcClass, *args, **kwargs):
    ''' script-level support for loading top-level Corps '''

    assert issubclass(ConcClass,
                      Corps) == True, f'{ConcClass.__name__} is not a Corps'

    frm = stack()[1]
    CallingModule = getmodule(frm[0])

    ConcClassInModule = getattr(CallingModule, ConcClass.__name__)

    ConfigFiles = 'ConfigFiles'
    if ConfigFiles not in kwargs:
        kwargs[ConfigFiles] = []

    NewConc = ConcClassInModule(*args, **kwargs)
    NewConcAddr = NewConc.ConcAddr

    ConcClassProxy = proxy(ConcClass, ConcClass.__name__ + 'Name',
                           CallingModule)
    NewProxy = ConcClassProxy(NewConcAddr)
    NewName = Name(NewProxy, ConcClass.__name__, CallingModule.__name__)

    return NewName
Exemplo n.º 9
0
def create_Corps(CorpsClass, *args, Tag="No Name", Ext=True, Managed=True, ConfigFiles=[], ConfigDicts=[], \
                                                                        LocType=LocType.Auto, LocVal=None, **kwargs):
    ''' create an ExtCorps from a script or an ExtCorps or ContCorps from calling Corps '''

    assert issubclass(
        CorpsClass,
        Corps.Corps) == True, f'{CorpsClass.__name__} is not a type of Corps'

    # todo: make sure inputs are clean/consistent

    # get who called us
    frm = stack()[1]
    CallingModule = getmodule(frm[0])

    # add our info to Config info
    CreateDicts = ConfigDicts.copy()
    CreateDict = {
        'Tag': Tag,
        'Ext': Ext,
        'Managed': Managed,
        'LocType': LocType,
        'LocVal': LocVal
    }
    CreateDicts.append(CreateDict)

    # Store kwargs for new Corps (will be processed by ConcMeta and stored as attributes)
    kwargs['ConfigFiles'] = ConfigFiles
    kwargs['ConfigDicts'] = CreateDicts

    EnvStatus = my_EnvStatus()
    if EnvStatus == MajorStatus.Running:
        # Called from an existing Corps...the CorpsMgr will do the work
        CorpsMgrConcAddr = ConcAddr(CORPSMGR_ENVID, CORPSMGR_CONCID,
                                    CORPSMGR_ENVID)
        TheCorpsMgr = Corps.CorpsMgrName(CorpsMgrConcAddr)

        FutRet = TheCorpsMgr.create_Corps(CallingModule.__name__, CorpsClass.__name__, Tag, Ext, Managed, LocType, \
                                                                                           LocVal, *args, **kwargs)
        # todo: Test for Exception

        NewXferCorpsEnvRecord = FutRet.Ret

        NewCorps_EnvId = NewXferCorpsEnvRecord.LocEnvId
        NewCorps_Ip = NewXferCorpsEnvRecord.IpAddr
        NewCorps_Port = NewXferCorpsEnvRecord.Port

    elif EnvStatus == MajorStatus.Nonexistent:
        # Called from a script...create the new Corps in another process
        CreateDict['Ext'] = True
        CreateDict['Managed'] = False

        WorkerQueue = Queue()

        NewCorpsProcess = Process(target=__other_process_create_Corps__, \
                              args=(CallingModule.__name__, CorpsClass.__name__, WorkerQueue, *args), kwargs=kwargs)
        NewCorpsProcess.start()

        NewCorpsData = WorkerQueue.get()
        NewCorps_Ip = NewCorpsData[0]
        NewCorps_Port = NewCorpsData[1]

    if Managed == True and EnvStatus == MajorStatus.Running:
        NewConcAddr = ConcAddr(CORPSMGR_ENVID, CORPS_CONCID, NewCorps_EnvId)
    else:
        NewConcAddr = ExtAddr(CORPSMGR_ENVID, CORPS_CONCID, CORPSMGR_ENVID,
                              NewCorps_Ip, NewCorps_Port)

    ConcClassProxy = proxy(CorpsClass, CorpsClass.__name__ + 'Name',
                           CallingModule)
    NewProxy = ConcClassProxy(NewConcAddr)
    NewName = Name(NewProxy, CorpsClass.__name__, CallingModule.__name__)

    return NewName