Readme를 보고 공부해본내용
usingStage: 3
다양한 리소스(메모리, I/O 등)의 수명 및 관리와 관련하여 소프트웨어 개발의 일반적인 패턴을 다루려는 것임
이 패턴에는 일반적으로 리소스 할당과 중요한 리소스를 명시적으로 해제하는 기능이 포함되어있다
예를 들어, ECMAScript Generator Functions는 사용자 정의 cleanup logic이 보존되도록 하기 위해 finally block을 명시적으로 평가하는 수단으로 return 메소드를 통해 이 패턴을 노출한다.
// 제너레이터 함수 선언
function * g() {
// 중요한 리소스라고 가정
const handle = acquireFileHandle();
// try-catch-finally 블록으로 리소스를 안전하게 처리
try {
...
}
finally {
// cleanup (리소스 해제)
handle.release();
}
}
// 제너레이터 객체 생성
const obj = g();
try {
// g()의 try-catch-finally 블록 실행
const r = obj.next();
...
}
finally {
// g()의 finally 블록을 실행
obj.return();
}
이 패턴은 좀 복잡하다고 생각했나보다.
단순하게 하려고 아래처럼 제안했다고 한다.
function * g() {
// 블록 스코프 변수 선언과 동시에 리소스 할당
using handle = acquireFileHandle();
}
// using 키워드를 사용하면 해당 블록에서 사용한 변수나
// 객체 등의 자원을 블록이 종료될 때 자동으로 리소스 해제
{
// g() 함수의 실행 결과를 obj 변수에 할당
using obj = g();
// obj.next()를 호출하여 g() 함수의 실행을 시작
const r = obj.next();
}
// finally 블록에서 obj.return()을 호출하여
// g() 함수 내부의 finally 블록이 실행된다
using을 사용해서 훨씬 간단해졌다.
또, 여러 리소스를 관리하는데 도움이 되는 두개의 일회용 컨테이너 object를 추가할 것을 제안했다고 한다.
DisposableStack(class) 제한된 개수의 요소를 가진 스택을 만들고, 사용한 다음에 자동으로 제거하는 기능을 제공한다고 한다
AsyncDisposableStack명시적인 자원 관리를 위한 제안
비동기 함수에서 발생하는 자원 누수를 방지하기 위해 만들어졌다
이거는 계속 논의중이고 어떻게 도입할지 아직 결정되지 않음
여기 깃헙에서 독립적으로 이야기중
lifetime에 민감한 작업을 수행하거나 가비지 수집되지 않는 reference(file handle, socket...)를 닫거나 해제해야 하는 특정 수명을 가진 개체
이왕 적는거 이어서 쓰면..
비동기적으로 사용되는 자원은 관리하는 것을 목표로한다.
// async 제너레이터 함수 g 선언
async function * g() {
// async 블록 스코프
// using 구문은 block statement 내에서 사용 가능
using await handle = acquireFileHandle();
}
// async 리소스 해제 (cleanup)
// async context
{
// obj 변수에 g() 할당
// 블록 스코프 정의
using await obj = g();
// obj.next()로 비동기 작업 수행하고 r에 할당
const r = await obj.next();
}
// 변수가 소멸될 때 g() 내의 finally block이 호출되며
// 비동기적으로 사용된 자원들이 정리