inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)

병행성 - 코루틴, Yield(3-2)

코루틴 Ex2 관련 질문 드립니다.

313

힌턴

작성한 질문수 5

0

안녕하세요. 강의 감사히 잘 듣고 있는 수강생입니다.

코루틴 Ex2 관련 내용 중 궁금한 점이 있어 질문 드립니다.

def coroutine2(x): 
    print('>>> coroutine started : {}'.format(x))
    y = yield x 
    print('>>> coroutine received : {}'.format(y))
    z = yield x + y 
    print('>>> coroutine received : {}'.format(x+y))
    print('>>> coroutine received : {}'.format(z))

cr3 = coroutine2(10)

from inspect import getgeneratorstate

print(getgeneratorstate(cr3)) # 상태 체크
print(next(cr3))
print(getgeneratorstate(cr3))
cr3.send(100) 
print(getgeneratorstate(cr3))
cr3.send(30) 

위 코드를 실행하면

GEN_CREATED

>>> coroutine started : 10

10

GEN_SUSPENDED

>>> coroutine received : 100

GEN_SUSPENDED

>>> coroutine received : 110

>>> coroutine received : 30

 

결과가 이처럼 나오는데, 두번째 GEN_SUSPENDED 이후가 이해가 잘 가지 않습니다.

첫 번째 cr3.send(100)은 y = yield x 의 x에 100을 넣어서 y의 print 문에서 received : 100이 나온 것으로 생각했는데,

두 번째 cr3.send(30)은 z = yield x + y의 x에 30을 넣는다고 생각하여 z의 print문(마지막 부분)이 130이 나와야 할 것 같은데 30이 나와서 혼란스럽습니다.

 

z = yield x + y 에 suspended 상태일 때

send를 통해서 서브루틴으로 값을 보내면 x와 y 값에 상관 없이 그냥 z에 30을 넣는 것인가요?

z = yield x + y 대신에

z = yield x 를 넣어도 결과는 동일한 것 같은데 어떤 차이가 있는지 궁금합니다.

메인루틴에서 받는 것만 달라지는 걸까요?

그리고 print(cr3.send(30)) 과 같은 형태로 서브루틴에서 메인루틴으로 준 것을 볼 수 있다고 하셨는데, print 말고 제가 직접 그 값을 쓰려면 어떻게 해야 하는지도 여쭤봅니다.

감사합니다.

 

 

python django

답변 1

0

좋은사람

안녕하세요.

우선 열심히 하셔서 너무 보기 좋습니다~

한 가지 질문안에 너무 많은 질문은 제가 답변 드리기가 곤란할 것 같습니다.

다시 정리하셔서 질문을 한 가지 형태로 올려주시면 좋을 것 같아요.

과외 형식으로 제가 답변드릴 수는 없기 때문에 질문을 하단 댓글로 부탁드립니다.

많은 질의 응답은 인프런 멘토링 기능도 활용할 수 있습니다.

아울러, 질의답변은 몇 일정도 소요될 수 있습니다.

감사합니다.

0

힌턴

안녕하세요. 우선 코드 내용은 제외하고 질문만 정리하겠습니다.

<질문1>

z = yield x + y 라인에 suspended 상태일 때,

메인루틴에서 send(30)을 통해 서브루틴으로 값을 보내면 함수 내 x와 y 값에 무관하게 z에 30을 넣는 것인가요?

0

힌턴

<질문2>

z = yield x + y 대신에

z = yield x 를 넣어도 결과는 동일한 것 같은데 어떤 차이가 있는지 궁금합니다.

<질문3>

메인루틴에서 서브루틴으로 값을 줄 때는 send로 보내는 것 같은데, 서브루틴에서 메인루틴으로 주는 값은 제가 어떻게 받을 수 있는지 궁금합니다. 키워드라도 알려주시면 찾아서 보겠습니다.

감사합니다. 인프런이 처음이라 멘토링 기능이 있는지 몰랐는데, Q&A 게시판에서 질문 드릴 수 있는 질문 수에 한계가 있다면 멘토링 기능을 활용해 보겠습니다. 감사합니다.

0

좋은사람

중간에 print문을 통해서 x,y,z 를 출력해 보시면 알 수 있는 내용입니다.

첫 10이 들어가고 이 값은 y에 할당 됩니다

그다음 100이 들어가고 x 에 할당 됩니다. 그래서 100 + 10 = 110이 출력됩니다.

다음에는 30이 들어가는데 할당가능한 곳이 z 밖에 없습니다. 이 부분은 말씀하신게 맞습니다.

질문2와 질문3은 외부 내부 값 주고받는 내용은 강의 내용중에도 확인 가능하고

링크로 대신합니다. 잘 나와 있으니 시간을 들여서 정독해 보세요.

중간에 그림 부분을 정확하게 이해하시면 됩니다.

https://dojang.io/mod/page/view.php?id=2419

진도미확인 (진도가 안 넘어감)

0

42

1

RuntimeError: There is no current event loop in thread 'MainThread'

0

86

1

chapter 07-01 실행 오류

0

68

1

Chapter05-04 : sum_func의 합이 이중 출력됩니다.

0

79

2

45. 병렬성 2 - Futures(5-1) wait가 의도된 대로 동작하지 않습니다.

0

95

2

멀티스레딩 - 44. 병렬성 1 - Futures(4-2)

0

72

2

chapter05_02 클로저 질문사항 !

0

54

1

LV1 설정

0

89

2

매직 메소드의 호출 방법 차이 문의

0

133

2

왜 numbers리스트를 만들때 str으로 숫자를 감싸나요?

0

96

2

스크랩핑 실습 중 Mac OS 인증서 문제

0

130

1

AsyncIO 멀티 스크랩핑 실습 예제 관련 질문

0

169

1

강의자료가 영상과 다릅니다

0

257

2

closure.cell_contents 초기화 하기 문의

0

132

2

map함수 사용 시, list변환 방법 문의

0

337

2

__mul__ 백터 * 숫지, 백터 * 백터 처리

0

146

1

del처리후 질문입니다.

0

155

1

car_list(car1,car2,car3) 인스턴스 tuple 타입 문의

0

225

1

coroutine에 대한 질문

0

244

1

제너레이터 이터레이터 질문이 있습니다.

0

251

1

atom install package search not working

0

277

1

Magic Method - Not Implemented

0

401

1

가상환경 질문!

0

406

1

병렬처리 추가 질문이 있습니다.

0

246

1