2014-05-18 1 views
1

내가 일하고있는 프로젝트에 SimPy 시뮬레이션을 추가하려고하는데 버전에 대해 혼란을 겪고있다. 3의 릴리스/요청.Simpy 3 : Resources.Resource.request() /. release() WITHOUT 'with ... as :'

'with'블록을 사용하여 리소스를 구현할 수 있었지만 내 상황에서는 'with'블록을 사용하지 않고 리소스를 요청/해제하려고합니다.

그러나이 예제는 SimPy 3을 사용하여 찾을 수 없습니다. 리소스와 관련된 설명서/소스를 읽었지 만 여전히 올바르게 이해할 수는 없습니다. 누군가가 제대로하는 방법을 설명해 줄 수 있습니까?

... 
Request a Resource with the method: 'request()' 
... 
Release that Resource with the method: 'release()' 
... 

고마워, 미안 해요.

추신 : 당신이 떠날 때 내가 객체에 with를 사용 Resources.resource

+0

그냥 "와"무엇을 읽어 실제로 않습니다. 그것은 단지 객체의 루틴을 호출합니다. (think__enter__ 및 __close__는 생각할 수 있지만 기억할 수는 없습니다.) 그런 다음 그 일을하십시오. 왜 "with ... As ..."를 사용하고 싶지 않으세요? – will

답변

3

가 그 단지 :

req = resource.request() 
yield req 
# do stuff 
resource.release(req) 
+0

정확히 내가 무엇을 요구하고 있는지. 파이썬 생성기에 익숙하지 않아서 SimPy를 더 어렵게 배웠습니다.SimPy를 개발해 주셔서 감사합니다! – Cactusman

3

를 사용하려는거야 당신이 with 블록을 입력 할 때 __enter__ 호출하고 __exit__. 당신이 #stuff을하고 당신은 정말 Request 객체에 __enter__를 호출하고

res = resource.Resource() 
with res.request() as req: 
    # stuff 

를 수행 할 때 그럼 __exit__ 전화 :

res = resource.Resource(...) 
req = res.request() 
#stuff 
if not req.triggered: 
    res.put_queue.remove(req) 
    res.release(req) 
:

class Request(base.Put): 
    def __exit__(self, exc_type, value, traceback): 
     super(Request, self).__exit__(exc_type, value, traceback) 
     self.resource.release(self) 

class Put(Event): # base.Put 
    def __enter__(self): 
     return self 

    def __exit__(self, exc_type, exc_value, traceback): 
     # If the request has been interrupted, remove it from the queue: 
     if not self.triggered: 
      self.resource.put_queue.remove(self) 

그래서, with 블록이 동일하다

그러나 with 블록은 정리 코드가 ex에 관계없이 호출되는지 확인합니다. 종결은 #stuff 동안 던져진다. 위의 코드를 사용하면이를 잃게됩니다.

+0

'try : ... finally :'를 사용하여 정리 코드를 얻었으나'with''를 사용할 수도 있습니다 ... – will

+0

감사합니다.이 예제는 SimPy 웹 사이트 문서를 기반으로 작성되었습니다. 귀하의 게시물을 읽으십시오 : https://gist.github.com/ndmacdon/1b43b8f29e66fee7a5e1#file-simpyrequestrelease – Cactusman

0

모두 설명은 PEP343입니다.

with EXPR as VAR: 
     BLOCK 

가된다 :

mgr = (EXPR) 
exit = type(mgr).__exit__ # Not calling it yet 
value = type(mgr).__enter__(mgr) 
exc = True 
try: 
    try: 
     VAR = value # Only if "as VAR" is present 
     BLOCK 
    except: 
     # The exceptional case is handled here 
     exc = False 
     if not exit(mgr, *sys.exc_info()): 
      raise 
     # The exception is swallowed if exit() returns true 
finally: 
    # The normal and non-local-goto cases are handled here 
    if exc: 
     exit(mgr, None, None, None) 

이것은 파이썬은 with... as... 블록을 사용하는 방법을 정확히입니다,하지만 난 당신이를 사용하지 않는 일부 이유가 추정하고있다. 그렇다면 __enter____exit__ 기능 만 있으면됩니다. 내가 생각하는 방식은 __enter__이 모든 것을 설정하고, __exit__이 모든 정리를 수행합니다. (당신이 중단되지 않습니다 당신이 알고있는) 당신이 with 블록하지 않고 자원을 사용하려면