동기방식은 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행할 수 있습니다. 일반적인 함수 형태가 여기에 속합니다.
비동기 방식은 응답이 돌아올 때까지 기다리지 않고 동시에 작업이 시작됩니다.
프로세스와 스레드의 실행 흐름을 말합니다.
일반적인 함수에서 볼 수 있는 방식으로 종석적인 루틴을 가지고 있습니다.
def func(a):
return a + 1
a = 1 # 여기서부터 시작해서
b = func(a) # 얘를 만나면 위에 함수로 점프해 실행하다가 밑으로 내려옴
a = 1
부터 시작하고func()
를 만나 함수부분으로 이동 후 함수작동이 종료되면 밑으로 이동
협력적으로 실행되는 루틴을 의미합니다. 코루틴의 예시를 보기 전에 기본적으로 알아야 할 함수 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!')
co
에 제네레이터 할당next(co)
로 이동- 제네레이터를 실행하고 무한반복 while문 진입
yield
를 만나고 값이 없는 상태이기에 일시정지co.send
를 만나고 일시정지했던yield
로 돌아감'Hello World'
를yield
로 보내고value
에 값 할당- 프린트문 실행
- while문 재시작
yield
를 만나고 일시정지- 실행할 코드가 없으니 코드실행 중지
오늘 배운 내용들은 이해하기 어려웠던 내용이 많았습니다. 특히 바로 위에 있는 제네레이터 코드는 이해하기 위해 하나씩 입력해가며 찍어봤습니다.
yield
를 넣으면 함수로 되어있던 것이 제네레이터로 바뀜
co
에 제네레이터를 할당하는 부분, 함수의 경우 저 구문에서 함수가 작동하는데 제네레이터의 경우 할당만 해주는거지 실제 작동하진 않음
yield가 co
에서 한번 next
에서 한번 합쳐서 2번 일시정지 되고 send
를 만나 하나를 해결하고 이후 할당값이 없어서 나머지 하나는 정지된 상태로 있는줄 알았습니다...
send
앞에 co
가 있으니 co
로 가서 함수로 올라가는 줄 알았는데, 바로 일시정지했던 yield
로 간다는 것이였습니다.