[TIL] 2023. 12. 13

Gahyeon Lee·2023년 12월 13일
0

TIL

목록 보기
25/47

🍔 비동기 프로그래밍

1. 비동기 프로그래밍이란?

  • 여러가지의 로직들이 완료 여부에 관계없이 실행되는 방식을 의미한다.
  • 작업을 하나씩 순서대로 수행하는 행위를 동기적 프로그래밍이라고 한다.
  • 동기적 프로그래밍은 순차적으로 수행하기 때문에 앞선 작업에 영향을 받는데, 이렇게 되면 앞선 작업이 끝나지 않으면 뒷작업은 영원히 수행할 수 없다.
  • 그러므로 꼭 동기적으로 실행하지 않아도 되는 기능은 비동기적으로 실행하는게 좋다.

ex) 5GB 영상 다운로드 → 메일 전송 → 알림의 순서를 가진 로직이 있다고 했을 때 해당 작업을 순차적으로 진행하는 동안 다른 작업을 하지 못하고 다른 작업을 하면 앱이 멈추는 등의 문제가 발생할 수 있다. 다른 작업을 하고있다가 영상 다운로드가 완료됐을 때 알림이 발생하도록 하고 싶다.

2. 동기 vs 비동기

  1. 동기 프로그래밍
  • 요청 보내고 결괏값을 받을 때까지 작업을 멈춘다.
  • 한 가지씩 작업을 처리한다.
  1. 비동기 프로그래밍
  • 요청 보내고 결괏값을 받을 때까지 멈추지 않고 또 다른 일을 수행한다.
  • 다양한 일을 한 번에 수행한다.

🍔 쓰레드

1. 쓰레드란?

  • 쓰레드는 로직을 동시에 실행할 수 있도록 해주는 것이다.
  • 프로그램은 하나의 메인 쓰레드(실행흐름)가 존재하는데, 하나의 메인 쓰레드는 fun main() 메인함수를 의미한다.
  • 실습 프로그램은 메인 쓰레드위에서 로직을 실행해서 동시 처리가 불가능했다.
  • 별도의 자식 쓰레드를 생성해서 동시에 로직을 실행(동시 처리)할 수 있다.
  • 코틀린은 thread 키워드로 쓰레드를 생성할 수 있다.

2. 용어

  • 프로세스(Process)
    • 프로그램이 메모리에 올라가서 실행될때 이를 프로세스 1개 라고 한다. 예를 들어, 바탕화면에 있는 프로그램을 더블클릭해서 실행하는 순간 프로세스가 된다.
    • 보통 프로그램을 더블클릭하면 프로세스가 생긴다.
  • 쓰레드(Thread)
    • 쓰레드는 프로세스보다 더 작은 단위이다.
    • 프로세스 안에서 더 작은 작업의 단위를 쓰레드 라고 부른다.
    • 쓰레드는 생성돼서 수행할 때 각 독립된 메모리 영역인 STACK을 가진다.
    • 즉, 쓰레드를 한 개 생성하면 스택메모리의 일정 영역을 차지한다.

3. 쓰레드 사용 위치의 예시

  • 몬스터를 공격하고, 체력이 줄어들고, 효과음이 발생하는 것이 동시에 일어나야 한다.
  • 경마 프로그램의 말들은 동시에 출발해서 경쟁해야 한다.

4. 예시 코드명

  • 1부터 10까지 출력하는 코드를 2개의 쓰레드로 경쟁시켜보자.
  • 1초마다 자원경쟁을 시키기위해 딜레이를 추가했다.
  • Thread1과 Thread2의 순서는 보장되지 않고 경쟁한다.
  • 코루틴 사용하기 전 사전 작업 외부 종속성 추가
    이 링크에 들어가서 Gradle 부분의 implementation부분 복사 -> Gradle Scripts의 build.gradle(Module:app)에 적당한 부분에 붙여넣기 -> Sync Now -> 코루틴 사용할 준비 끝! -> 빨간 줄로 뜨는 부분 import 해주기
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.concurrent.thread

// 2개의 자식 쓰레드, 그 둘을 포함하는 것이 메인 쓰레드. 총 3개의 쓰레드
// 쓰레드로 동작하기 때문에 두 쓰레드가 동시에 처리된다. 동시에 처리된다는 것은 하나의 CPU 자원을 가지고 경쟁한다는 것이다.
// 즉 1초마다 CPU 자원을 할당한 쓰레드가 먼저 실행된다는 것
// import가 안 돼있으면 빨간줄 뜸
fun main() {
    thread(start = true) {    // 1~10까지 1초마다 쉬면서 출력됨, import : concurrent
        for(i in 1..10) {
            println("Thread1: 현재 숫자는 ${i}")
            runBlocking {     // 1초마다 강제로 쉬게 하는 비동기 함수
                launch {
                    delay(1000)    // import : Long
                }
            }
        }
    }

    thread(start = true) {    // 50~60까지 1초마다 쉬면서 출력됨
        for(i in 50..60) {
            println("Thread2: 현재 숫자는 ${i}")
            runBlocking {
                launch {
                    delay(1000)
                }
            }
        }
    }
}

/* 결과
실행할 때마다 Thread1과 2의 출력되는 순서가 랜덤으로 다르다.
동시에 실행되지만 1초마다 쉬고 나서, CPU 자원을 할당하기 위해 경쟁할 때 조금 더 빠르게 CPU에 접근한 Tread가 자원을 할당받아서 코드를 실행하기 때문! 
 */
profile
코린이 강아지 집사🐶

0개의 댓글