2016-07-21 7 views
1

David Beazley의 매우 좋은 coroutines를 가지고 있다고 생각했지만 presentation 매우 좋았지 만 PEP-492에 설명 된 새로운 구문으로 완전히 조정할 수는 없습니다.asyncio coroutines

프리젠 테이션에서 그는 코 루틴이 어떻게 발전기 에서처럼 끌어 당기는 파이프 라인으로 간주 될 수 있는지 설명합니다. 예를 들어

:

# cofollow.py 
# 
# A simple example showing how to hook up a pipeline with 
# coroutines. To run this, you will need a log file. 
# Run the program logsim.py in the background to get a data 
# source. 

from coroutine import coroutine 

# A data source. This is not a coroutine, but it sends 
# data into one (target) 

import time 
def follow(thefile, target): 
    thefile.seek(0,2)  # Go to the end of the file 
    while True: 
     line = thefile.readline() 
     if not line: 
      time.sleep(0.1) # Sleep briefly 
      continue 
     target.send(line) 

# A sink. A coroutine that receives data 

@coroutine 
def printer(): 
    while True: 
     line = (yield) 
     print line, 

# Example use 
if __name__ == '__main__': 
    f = open("access-log") 
    follow(f,printer()) 

가 어떻게이 새로운 구문을 사용하여 printer() 코 루틴을 구현할 수있다? 코 루틴이이 새로운 구문을 사용하도록 유도되는 사례를 아직 보지 못했습니다. 가능한가?

+0

이것은 실제로 'asyncio'와는 관련이 없습니다. 이벤트 루프를 사용하지 않는다면, asyncio 모듈이 제공하는 의미에서 실제로 비동기는 아닙니다. – deceze

+3

이 예제는 coroutine이 다른 coroutine을 실행해야하는지, 어떤 값을 보내야 하는지를 결정하는 전통적인 coroutine에 관한 것입니다. 이것은 유지하기 어렵고 일반적으로 필요하지 않으므로 비동기 코 루틴은 다르게 동작합니다. 그들이 할 수있는 일은 달리기 권리를 포기하고 지속이이 코 루틴이어야하는 작업을 나타내는 기다릴 수있는 미래의 물체를 전달하는 것입니다. 그리고이 모든 것을 조정하는 이벤트 루프가 있으며, 기다리는 시간이 끝나면 실행되어 올바른 값을 coroutines로 전송합니다. –

답변

1

당신이 가지고있는 것은 asyncio 모듈 및/또는 PEP-492의 의미에서 코 루틴이 아닙니다. PEP에 자체가 말하기를 :

[이 PEP는]은 코 루틴 이벤트까지 (예 : IO로) 기다리고있을 것입니다 것을 나타내는, 스케줄러에 대한 신호로 yield를 사용하여 코 루틴의 종류에 관련이 완료되었습니다. 더 스케줄러 귀하의 예에 참여 (이벤트 루프가) 없습니다

  1. 코 루틴은 "스케줄러에 대한 신호로"만 yield를 사용하지 않는; 실제로 데이터를 읽는 데 사용하고 있습니다.
관련 문제