在 python 子进程或线程或进程中保留 class 运行

Keep a class running in a python subprocess or thread or process

我正在使用 Squish 来自动化基于 Qt 的 GUI 应用程序。我递归地在应用程序中查找 qt 对象。由于它是时间密集型的,我想缓存一旦找到的对象供以后重用。我有以下 class 来维护字典中的对象缓存 -

    
    def __init__(self):
        self.object_store = {}
    
    @staticmethod
    def instance():
        if '_instance' not in ObjectCache.__dict__:
            ObjectCache._instance = ObjectCache()
        return ObjectCache._instance
    
    def set(self, object_name, obj):
        self.object_store[object_name] = obj
    
    def remove(self, object_name):
        del self.object_store[object_name]
    
    def exists(self, object_name):
        if object_name in self.object_store:
            return True
        return False
    
    def get(self, object_name):
        return self.object_store[object_name]
        
    def get_all(self):
        return self.object_store

我的自动化脚本中的函数有以下装饰器,从这本字典到 add/access/delete -

def object_caching_decorator(func):
    def wrapper(*args, **kwargs):
        object_cache = ObjectCache.instance()
        if object_cache.exists(func.__name__):
            try:
                if waitForObject(object_cache.get(func.__name__)):
                    return object_cache.get(func.__name__)
            except LookupError:
                object_cache.remove(func.__name__)
        obj = func(*args, **kwargs)
        object_cache.set(func.__name__, obj)
        return obj
    return wrapper

有人可能会问为什么不能所有的脚本共享这个 class 对象?因为 Squish 工具在开始每个测试脚本之前重置了全局符号 table 因此我需要一种方法来保留这个对象。

如何保留此 class 运行 以便另一个进程(Squish runner)上的脚本 运行 可以无缝访问它?

每个 Squish 测试用例都在 squishr​​unner 的新实例(进程)和托管在其中的脚本解释器中执行。

Squish 在测试脚本中为您提供的对象引用实际上是代理对象,它们透明地(在幕后)为您访问应用程序内部的实际对象,您无需为此“魔法”做任何事情发生(或意识到,大多数时候)。 Caching/persisting 跨测试用例的这些对象将不起作用,也不可能。

此外,缓存对象引用是一个臭名昭著的问题,因为如果 AUT(被测应用程序)发生变化或以不同方式使用,这些代理对象引用的对象的 life-time 可能会发生变化。

相反,您应该重新审视查找对象的方式。很可能有更好的方法允许 ad-hoc 对象查找(如预期的那样)足够快。 (如果有疑问,我建议联系 Squish 的供应商,因为您的维护合同或订阅他们的产品使您有权获得技术支持。)