비동기 함수
비동기 함수란 동기 함수와는 다르게 호출 시점에서 실행 결과를 기다리지 않는 함수입니다.
- 동기 함수
동기 함수의 경우 함수 호출 시 해당 함수 호출에 대한 결과가 나올 때까지 동기 함수를 호출한 스레드의 동작이 사실상 중지하게 됩니다.
이때 사용자는 프로그램이 멈춘 것 같은 느낌을 받을 수 있습니다. - 비동기 함수
비동기 함수의 경우 비동기 함수를 호출한 스레드에서 해당 함수 호출에 대한 결과를 기다리지 않고 바로 다음 작업을 수행할 수 있습니다.
이때 로딩 같은 작업을 수행하면 사용자에게 프로그램이 멈춘 것이 아닌 데이터를 로딩 혹은 저장 중이라는 경험을 제공할 수 있습니다.
비동기 함수 사용 시 주의사항
동기 함수, 비동기 함수 관계없이 서버로 요청을 보내기 위해 함수를 호출하면 즉시 서버로 요청이 보내지지 않습니다.
모든 요청이 OS 스케줄러에 따라 OS가 여건이 될 때 서버로 요청이 보내집니다.
다만 이 시간은 매우 짧아 바로 함수 호출 즉시 서버로 요청이 가는 것처럼 보입니다.
비동기 함수의 경우 비동기 IO 스레드에서 요청 및 응답이 이루어지기 때문에 한 번에 여러 개의 비동기 함수를 호출할 수 있습니다.
이때 아래 사항을 주의해야 합니다.
- 호출 순서에 따른 순서 보장이 되지 않습니다.
- 게임 정보의 동일한 row 수정과 같은 작업을 수행하면 최종적 읽기 일관성이 보장이 안되어 일부 요청이 실패할 수 있습니다.
콜백 함수
비동기 함수의 콜백 함수는 비동기 IO 스레드 내에서 실행되게 됩니다.
이때 유니티의 정책에 따라 별도의 스레드에서 실행되는 콜백 함수는 유니티 MonoBehaviour 객체에 접근할 수 없습니다.
즉 콜백 함수 내에서는 유니티 객체, UI 객체 등에 접근할 수 없기 때문에 비동기 함수의 요청 결과에 따른 처리를 위해서는
별도의 Dispatcher의 사용이 필요할 수 있습니다.
콜백 함수 풀링
콜백 함수의 경우 위의 설명한 것과 같이 비동기 IO 스레드에서 실행되기 때문에 유니티의 MonoBehavior 객체에 접근할 수 없습니다.
이때 콜백 함수 풀링을 이용하여 콜백 함수를 메인 스레드에서 실행되도록 할 경우 유니티의 MonoBehavior 객체에 접근할 수 있습니다.
콜백 함수 풀링을 사용하는 방법에 대해서는 콜백 함수 풀링 문서를 참고해 주세요.
비동기 함수를 호출하는 상황
- 대부분의 상황에 사용이 권장됩니다.
- 한 번에 여러 개의 비동기 함수를 요청하는 경우 8개 이하로 요청하는 것이 권장됩니다.
- 함수 호출 순서 간 순서 보장이 필요하지 않을 때
- 게임 종료 시 현재 유저의 데이터의 저장을 시도할 때
비동기 함수를 호출하면 안 되는 상황
- 한 번에 여러 개의 비동기 함수를 요청하고 요청한 순서 간의 순서 보장이 필요할 때
- 한 번에 여러 개의 비동기 함수를 요청하고, 이때 동일한 데이터의 수정 작업을 수행할 때
- 게임 정보 수정 시 테이블 내 동일한 row 수정 요청을 한 번에 여러 개 보낸 경우 요청 중 1개만 성공하게 됩니다.
- 길드 메타 데이터/굿즈 수정, 실시간 랭킹 갱신 등의 작업이 모두 이에 해당됩니다.