美文网首页
db连接对象在多线程中无法被复制

db连接对象在多线程中无法被复制

作者: lalalasa | 来源:发表于2020-09-22 16:46 被阅读0次

接口自动化过程中会创建很多测试数据,时间长了以后,这部分测试数据量就变得很大,因此考虑在测试用例跑完后就删除创建的测试数据。

想法是,创建一个DBConn类,在sdk中增加数据库链接,这样就能在继承NewSdk的实例中直接通过直接调用该类实例。

代码如下:

class NewSdk(SdkBase):
    def __init__(self, cookie=None, country=None, env=None, api_base=None):
        super().__init__(cookie, country, env, api_base)
        self.demo_principal_id = DEMO_PRINCIPAL_ID[env]
        if not hasattr(global_data, 'conn'):
            flobal_data.conn = DBConn(self.env)
        self.conn = conn

但是执行的时候报错了,出现错误提示:TypeError:can't pickle _thread._local objects

image.png

这里 找到一个解释,原因是在多线程中,(db)conn是无法复制的对象。

解决方法:
用@property将将(db)conn作为类的属性(在实例中调用conn的方法与在_init_()中定义的self.conn相同)

class NewSdk(SdkBase):
    def __init__(self, cookie=None, country=None, env=None, api_base=None):
        super().__init__(cookie, country, env, api_base)
        self.demo_principal_id = DEMO_PRINCIPAL_ID[env]

    @property
    def conn(self):
        if not hasattr(global_data, 'conn'):
            global_data.conn = DBConn(self.env)
        return global_data.conn

相关文章

网友评论

      本文标题:db连接对象在多线程中无法被复制

      本文链接:https://www.haomeiwen.com/subject/qbaiyktx.html