#contextmanager #with #yield #ray
contextlib 의 contextmanager 를 사용하는 목적은
with 문장 안에서 커스텀 Function 을 사용하기 위함이다.
https://docs.python.org/ko/3/library/contextlib.html
보통 많이 사용하는 패턴이
with open('tmp/path/your/desti', 'w') as f:
f.write("hello python!")
이러면 좋은점이 file 을 열고 닫는 내용을 직접 명시하지 않아도 된다.
ray 를 사용할 때에도 매번 Init() 함수를 호출하고,
끝날 때에는 shutdown() 함수를 꼭 호출해야 한다.
다른 예로는 pyspark 를 사용할 때인데
이때도 init() 과 close() 를 꼭 해줘야 한다.
그래서 이럴때 contextmanager 를 한 번 만들어두고 사용하면 편리할 것 같다는 생각이다.
간단하게 ray 를 예로 들면,
import ray
from contextlib import contextmanager
@contextmanager
def ray_cluster(**ray_init_args):
_ = ray.init(**ray_init_args)
try:
yield ray
finally:
ray.shutdown()
@ray.remote
def hello_world():
return "Hello, World!"
with ray_cluster(ignore_reinit_error=True) as ray:
result = ray.get([hello_world.remote() for i in range(10)])
print(result)
대략 이런 코드 모양이 아닐까 싶다.
@contextmanager 역할이 바로 ray_cluster 함수를 우리 잘 알고있는 open 함수와 비슷하게 만들어 준다.
공식문서를 한 번 천천히 읽어보면서 내 상황에 맞게끔 contextmanager 를 만들어 사용하면 될 듯.