tokio spawning
tokio에 대해 공부하던 중, 이전에 남긴 포스팅이 생각이 났다. 'static의 사용법에 관한 포스팅이었는데 좀 더 자세히 나와있는 것 같다.
https://velog.io/@wang_ki/rust-라이프타임
tokio를 사용해 task를 spawn하기 위해서는 send trait을 구현하면서 동시에 'static을 만족시켜야 한다. 이 말의 의미는 아래 내용과 같다.

Spawned된 Task가 외부에서 빌려온 참조를 가지면 안된다는 의미이다.
예시를 보자면
use tokio::task;
#[tokio::main]
async fn main() {
let v = vec![1, 2, 3];
task::spawn(async {
println!("Here's a vec: {:?}", v);
});
}
위 코드는 컴파일 에러가 발생한다. println!은 값을 빌려와 화면에 출력을 한다. 즉, Vec 타입인 v 변수의 참조를 가져오게 되는데, 'static bound를 만족시키지 못해서 에러가 발생한다. 만약에 참조를 가지고 있다면 spawned된 task가 poll을 통해서 동작할 때, 실제 데이터가 여전히 살아있는 지 보장할 수 없다.
메인 함수가 아닌 다른 함수에서 spawn이 된 경우 빌려온 데이터에 접근할 때, Dangling Pointer 문제가 발생할 수 있으므로 Rust 컴파일러가 이를 미리 막아주는 것이다.
'static bound에 대해서 이해하고 있었는데, tokio의 공식 문서를 확인하니 더욱 이해가 되는 것 같다. 공식 문서를 읽어보는 습관을 들이면 좋을 것 같다.