美文网首页
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