[TIL #24] 동기와 비동기, 코루틴(coroutine)

안떽왕·2023년 4월 19일
0

Today I Learned

목록 보기
24/76

동기와 비동기

동기(Synchronous)

동기방식은 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행할 수 있습니다. 일반적인 함수 형태가 여기에 속합니다.

비동기(Asynchronous)

비동기 방식은 응답이 돌아올 때까지 기다리지 않고 동시에 작업이 시작됩니다.

루틴

프로세스와 스레드의 실행 흐름을 말합니다.

서브루틴(subroutine)

일반적인 함수에서 볼 수 있는 방식으로 종석적인 루틴을 가지고 있습니다.

def func(a):
	return a + 1

a = 1    # 여기서부터 시작해서
b = func(a)    # 얘를 만나면 위에 함수로 점프해 실행하다가 밑으로 내려옴

a = 1부터 시작하고 func()를 만나 함수부분으로 이동 후 함수작동이 종료되면 밑으로 이동

코루틴(coroutine)

협력적으로 실행되는 루틴을 의미합니다. 코루틴의 예시를 보기 전에 기본적으로 알아야 할 함수 3개를 짚고 가겠습니다.

  • yield = 함수가 호출될 때 값을 반환하고 일시 중지합니다. 그리고 다시 호출될 때 중지한 지점에서 다시 실행합니다.
  • send = yield함수를 호출하면서 값을 전달해줍니다.
  • next = 함수의 실행이 일시 중지되고, yield가 반환한 값을 반환합니다. 이후 함수는 다시 실행되어 다음 yield까지 진행합니다.
# yield를 사용한 순간 함수가 아니라 제네레이터로 바뀜
def my_coroutine():
    while True:
        value = yield
        print('Received value:', value)

# 코루틴 객체 생성
co = my_coroutine()

# 코루틴 실행 준비
next(co)

# 값을 보내기
co.send('Hello, world!')
  1. co에 제네레이터 할당
  2. next(co)로 이동
  3. 제네레이터를 실행하고 무한반복 while문 진입
  4. yield를 만나고 값이 없는 상태이기에 일시정지
  5. co.send를 만나고 일시정지했던 yield로 돌아감
  6. 'Hello World'yield로 보내고 value에 값 할당
  7. 프린트문 실행
  8. while문 재시작
  9. yield를 만나고 일시정지
  10. 실행할 코드가 없으니 코드실행 중지

후기

오늘 배운 내용들은 이해하기 어려웠던 내용이 많았습니다. 특히 바로 위에 있는 제네레이터 코드는 이해하기 위해 하나씩 입력해가며 찍어봤습니다.

하나하나 찍어보면서 알게된 것

  1. yield를 넣으면 함수로 되어있던 것이 제네레이터로 바뀜

  2. co에 제네레이터를 할당하는 부분, 함수의 경우 저 구문에서 함수가 작동하는데 제네레이터의 경우 할당만 해주는거지 실제 작동하진 않음

    yield가 co에서 한번 next에서 한번 합쳐서 2번 일시정지 되고 send를 만나 하나를 해결하고 이후 할당값이 없어서 나머지 하나는 정지된 상태로 있는줄 알았습니다...

  3. send 앞에 co가 있으니 co로 가서 함수로 올라가는 줄 알았는데, 바로 일시정지했던 yield로 간다는 것이였습니다.

profile
이제 막 개발 배우는 코린이

0개의 댓글