我有以下简单的类定义:
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
这将有助于查看您的类的外观,但是如果它有来自
multiprocessing
的方法,那么您可能会在默认情况下对其进行pickle处理。多处理对象也可以使用锁,这些锁(显然)是不可拾取的。在您可以使用^{} 方法或
__reduce__
(在同一位置记录)自定义酸洗。在相关问题 更多 >
编程相关推荐