为什么Python pickling库抱怨不存在的类成员?

2024-04-23 11:43:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下简单的类定义:

def apmSimUp(i):
    return APMSim(i)

def simDown(sim):
    sim.close()

class APMSimFixture(TestCase):

    def setUp(self):
        self.pool = multiprocessing.Pool()
        self.sims = self.pool.map(
            apmSimUp,
            range(numCores)
        )

    def tearDown(self):
        self.pool.map(
            simDown,
            self.sims
        )

当类APMSim纯粹由简单的python基元类型(字符串、列表等)定义时,唯一的例外是静态成员,这是一个多处理经理列表在

但是,当我试图执行这个类时,我得到了以下错误信息:

^{pr2}$

奇怪的是螺纹锁紧在任何地方都找不到,我严格避免使用任何多线程组件(如您所见,只使用多处理组件)。而且这些组件都不存在于我的类中,或者只是作为静态成员存在,我应该怎么做才能使这个类成为可选择的?在

顺便问一下,有没有办法把害群之马排除在腌制之外?像Java的@transient注释?在

非常感谢你的帮助!在

更新:以下是我的完整APMSim类,请查看是否发现任何违反其可拾取性的内容:

usedINums = mav.manager.list()
class APMSim(object):
    global usedINums

    @staticmethod
    def nextINum():
        port = mav.nextUnused(usedINums, range(0, 254))
        return port

    def __init__(self, iNum):
        # type: (int) -> None

        self.iNum = iNum
        self.args = sitl_args + ['-I' + str(iNum)]

    @staticmethod
    def create():
        index = APMSim.nextINum()
        try:
            result = APMSim(index)
            return result
        except Exception as ee:
            usedINums.remove(index)
            raise

    @lazy
    def _sitl(self):
        sitl = SITL()
        sitl.download('copter', '3.3')
        sitl.launch(self.args, await_ready=True, restart=True)
        print("launching .... ", sitl.p.pid)
        return sitl

    @lazy
    def sitl(self):
        self.setParamAndRelaunch('SYSID_THISMAV', self.iNum + 1)
        return self._sitl

    def _getConnStr(self):
        return tcp_master(self.iNum)

    @lazy
    def connStr(self):
        self.sitl
        return self._getConnStr()

    def setParamAndRelaunch(self, key, value):

        wd = self._sitl.wd
        print("relaunching .... ", self._sitl.p.pid)
        v = connect(self._getConnStr(), wait_ready=True) # if use connStr will trigger cyclic invocation
        v.parameters.set(key, value, wait_ready=True)
        v.close()
        self._sitl.stop()
        self._sitl.launch(self.args, await_ready=True, restart=True, wd=wd, use_saved_data=True)
        v = connect(self._getConnStr(), wait_ready=True)
        # This fn actually rate limits itself to every 2s.
        # Just retry with persistence to get our first param stream.
        v._master.param_fetch_all()
        v.wait_ready()
        actualValue = v._params_map[key]
        assert actualValue == value
        v.close()

    def close(self):

        self._sitl.stop()
        usedINums.remove(self.iNum)

lazy decorator来自此库:

https://docs.python.org/2/tutorial/classes.html#generator-expressions


Tags: selftrueclosereturndefargslazyready
1条回答
网友
1楼 · 发布于 2024-04-23 11:43:17

这将有助于查看您的类的外观,但是如果它有来自multiprocessing的方法,那么您可能会在默认情况下对其进行pickle处理。多处理对象也可以使用锁,这些锁(显然)是不可拾取的。在

您可以使用^{}方法或__reduce__(在同一位置记录)自定义酸洗。在

相关问题 更多 >