2016-10-12 3 views
0

나는 다음과 같은 간단한 클래스 정의가 :왜 Python 산 세척 라이브러리가 존재하지 않는 클래스 멤버에 대해 불평합니까?

클래스 APMSim가 일반 간단한 파이썬 기본 유형 (문자열,리스트 등) 유일한 예외는 멀티 매니저 정적 멤버이다 순전히 정의
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 
     ) 

. 나는 엄격하게 multithreadi를 방지,

Error 
Traceback (most recent call last): 
    File "/home/peng/git/datapassport/spookystuff/mav/pyspookystuff_test/mav/__init__.py", line 77, in setUp 
    range(numCores) 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map 
    return self.map_async(func, iterable, chunksize).get() 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get 
    raise self._value 
MaybeEncodingError: Error sending result: '[<pyspookystuff.mav.sim.APMSim object at 0x7f643c4ca8d0>]'. Reason: 'TypeError("can't pickle thread.lock objects",)' 

thread.lock 어디서나 찾을 수 없습니다로 이상하다 :이 클래스를 실행하려고 할 때 그러나 목록

는, 나는 다음과 같은 오류 정보를 가지고 구성 요소 (볼 수 있듯이 멀티 프로세싱 구성 요소 만 사용됨). 그리고이 구성 요소 중 어느 것도 내 수업에 없거나 정적 멤버로만 존재합니다.이 클래스를 picklable로 만들기 위해 어떻게해야합니까?

그런데 검은 양의 일원을 산세에서 제외시키는 방법이 있습니까? Java의 @transient 주석처럼?

도움을 주셔서 감사합니다.

UPDATE : 당신이 그것을 picklability을 위반 아무것도 찾을 경우 다음은 내 전체 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) 
:

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

답변

0

클래스가 어떻게 보이는지 알 수는 있지만, multiprocessing의 메소드가있는 경우 기본적으로 산만 한 문제가있을 수 있습니다. 다중 처리 객체는 잠금을 사용할 수 있으며 이는 분명히 unpickle 가능합니다.

__getstate__ 방법 또는 __reduce__ (같은 위치에서 문서화 됨)을 사용하여 산세를 사용자 정의 할 수 있습니다.

+0

하지만 정적 멤버이며 최상위 레벨 변수와 같은 방식으로 정적 멤버를 처리해야합니까? – tribbloid

+0

이미 다중 처리 관리자 목록 만 전역 구성원으로 이동되었지만 문제가 남아 있습니다. 내 업데이트를 참조하십시오. – tribbloid

+0

@tribbloid : 아니오 피클을 피우는 것이 그렇게 간단하지 않습니다. 당신이 Google을 이미 가지고 있기 때문에 이미 토론을하고 있습니다. 왜 피클을하고 싶은 수업을 보여줄 수 없습니까? –

관련 문제