이벤트 루프에서 asyncio 생성기 데이터를 다시 생성 할 수 있습니까?

거터

httpx를 사용하여 코 루틴 내부의 여러 동시 HTTP 스트리밍 요청에서 읽고 , 최종 데이터를 반환하는 대신 이벤트 루프를 실행하는 비동기 함수로 데이터를 되돌리고 싶습니다.

그러나 비동기 함수를 반환하는 대신 yield로 만들면 불평을 asyncio.as_completed()받고 loop.run_until_complete()비동기 생성기가 아닌 코 루틴 또는 Future를 기대합니다.

그래서 이것이 작동하도록 할 수있는 유일한 방법은 각 코 루틴 내에서 스트리밍 된 모든 데이터를 수집하고 요청이 완료되면 모든 데이터를 반환하는 것입니다. 그런 다음 모든 코 루틴 결과를 수집하고 마지막으로 비동기 호출 함수로 반환합니다.

, 모든 것을 메모리에 보관하고 모든 데이터를 얻기 전에 가장 느린 요청이 완료 될 때까지 기다려야하므로 HTTP 요청 스트리밍의 전체 지점을 무력화합니다.

이런 일을 할 수있는 방법이 있습니까? 내 현재 어리석은 구현은 다음과 같습니다.

def collect_data(urls):
    """Non-async function wishing it was a non-async generator"""

    async def stream(async_client, url, payload):
        data = []
        async with async_client.stream("GET", url=url) as ar:
            ar.raise_for_status()
            async for line in ar.aiter_lines():
                data.append(line)
                # would like to yield each line here
        return data

    async def execute_tasks(urls):
        all_data = []
        async with httpx.AsyncClient() as async_client:
            tasks = [stream(async_client, url) for url in urls]
            for coroutine in asyncio.as_completed(tasks):
                all_data += await coroutine
                # would like to iterate and yield each line here
        return all_events

    try:
        loop = asyncio.get_event_loop()
        data = loop.run_until_complete(execute_tasks(urls=urls))
        return data
        # would like to iterate and yield the data here as it becomes available
    finally:
        loop.close()

편집 : 나는 asyncio.Queue또한 trio메모리 채널을 사용하여 몇 가지 솔루션을 시도했지만 비동기 범위의 항목에서만 읽을 수 있기 때문에 솔루션에 더 가까이 가지 않습니다.

편집 2 : 비동기 생성기에서 이것을 사용하려는 이유는 Django Rest Framework 스트리밍 API를 사용하여 Django 앱에서 사용하고 싶기 때문입니다.

사용자 4815162342

일반적으로 비 collect_data동기화하고 전체적으로 비동기 코드를 사용해야합니다. 이것이 asyncio가 사용되도록 설계된 방식입니다. 그러나 이것이 어떤 이유로 실행 가능하지 않은 경우 몇 가지 글루 코드를 적용하여 비동기 반복기를 수동으로 반복 수 있습니다 .

def iter_over_async(ait, loop):
    ait = ait.__aiter__()
    async def get_next():
        try:
            obj = await ait.__anext__()
            return False, obj
        except StopAsyncIteration:
            return True, None
    while True:
        done, obj = loop.run_until_complete(get_next())
        if done:
            break
        yield obj

위의 작동 방식은 __anext__매직 메서드를 사용하여 비동기 반복기에서 값을 계속 검색 하고 객체가 도착할 때 반환 하는 비동기 클로저를 제공하는 것입니다. 이 비동기 클로저는 run_until_complete()일반 동기화 생성기 내부의 루프에서 호출됩니다 . (클로저는 실제로 지원되지 않을 수있는를 StopAsyncIteration통해 전파되는 것을 방지하기 위해 완료 표시기와 실제 객체 쌍을 반환합니다 run_until_complete.)

이를 통해 execute_tasks비동기 생성기 ( async defwith yield)를 만들고 다음을 사용하여 반복 할 수 있습니다.

for chunk in iter_over_async(execute_tasks(urls), loop):
    ...

이 접근 방식은와 호환되지 asyncio.run않으며 나중에 문제가 발생할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Sanic 함수에서 호출하면 "실행중인 이벤트 루프에서 asyncio.run ()을 호출 할 수 없습니다."가 발생합니다.

분류에서Dev

메인 이벤트 루프를 차단하지 않고 다른 스레드에서 메인 이벤트 루프에서 생성 된 QObject에 어떻게 액세스 할 수 있습니까?

분류에서Dev

Python3 asyncio 새 스레드를 생성 할 때 스레드에 현재 이벤트 루프가 없습니다.

분류에서Dev

Material UI Autocomplete : 'Enter'이벤트 외에 이벤트에 태그를 생성 할 수 있습니까?

분류에서Dev

기본 iOS 7 캘린더에서 이벤트를 생성 할 수 없습니다.

분류에서Dev

솔루션에서 새 Prism 프로젝트를 생성 할 수 없습니다.

분류에서Dev

솔루션에서 새 Prism 프로젝트를 생성 할 수 없습니다.

분류에서Dev

Scala에서 "yield"로 이것을 할 수 있습니까? (조합 벡터를 생성하는 중첩 for 루프)

분류에서Dev

while 루프에서 결과를 생성 할 수 없습니다.

분류에서Dev

SAS DS2 데이터 단계에서보기를 생성 할 수 있습니까?

분류에서Dev

생성되는 이벤트 수에 제한이 있습니까?

분류에서Dev

Snorkel : 분류기 훈련과 레이블 지정 기능 생성을 위해 데이터 세트에 다른 기능을 사용할 수 있습니까?

분류에서Dev

데이터베이스에 성공적으로 게시 할 때 경고 ()를 발생시킬 수 없습니다.

분류에서Dev

다른 이벤트의 한 이벤트에 대해 작성된 JS 함수를 호출 할 수 있습니까?

분류에서Dev

Postgresql 함수 내에서 임시 테이블을 생성 할 수 있습니까?

분류에서Dev

모든 JRadioButton이 루프에서 생성 된 ButtonGroup에 대해 어떻게 setSelected를 설정할 수 있습니까?

분류에서Dev

python 3.7.5 : asyncio.get_event_loop가 이벤트 루프를 생성하지 않았습니다.

분류에서Dev

유도 유형의 두 생성자 표현식이 Coq에서 동일한 경우 해당 인수를 기반으로 다시 작성할 수 있습니까?

분류에서Dev

NTFS 파티션이 생성 된시기를 확인할 수 있습니까?

분류에서Dev

NTFS 파티션이 생성 된시기를 확인할 수 있습니까?

분류에서Dev

생성기 함수에서이 값을 바인딩 할 수 있습니까?

분류에서Dev

Dynmic JAVA 프로젝트를 생성했으며 데이터베이스에서 JSP로 데이터를 검색 할 수 없습니다.

분류에서Dev

내 Android 앱에는 일부 장치에서 Activitynotfoundexception 기반 충돌이 있습니다. 어떻게 다시 생성 할 수 있습니까?

분류에서Dev

TTabSheet 컨트롤에서 OnResize 이벤트가 생성되었는지 어떻게 확인할 수 있습니까?

분류에서Dev

스트라이프 체크 아웃 : 세션 개체 생성시 메타 데이터를 전달하고 checkout.session.completed 이벤트에서 수신합니다.

분류에서Dev

MongoDB에서 데이터를로드하여 EJS로 웹 페이지를 자동 생성 할 수 있습니까?

분류에서Dev

ionic에서 프로젝트를 생성 / 시작할 수 없습니다.

분류에서Dev

Maybes에서 데이터를 구성 할 수도 있습니다.

분류에서Dev

하드 디스크 파일에 대한 ECC 데이터를 생성 할 수있는 방법이 있습니까?

Related 관련 기사

  1. 1

    Sanic 함수에서 호출하면 "실행중인 이벤트 루프에서 asyncio.run ()을 호출 할 수 없습니다."가 발생합니다.

  2. 2

    메인 이벤트 루프를 차단하지 않고 다른 스레드에서 메인 이벤트 루프에서 생성 된 QObject에 어떻게 액세스 할 수 있습니까?

  3. 3

    Python3 asyncio 새 스레드를 생성 할 때 스레드에 현재 이벤트 루프가 없습니다.

  4. 4

    Material UI Autocomplete : 'Enter'이벤트 외에 이벤트에 태그를 생성 할 수 있습니까?

  5. 5

    기본 iOS 7 캘린더에서 이벤트를 생성 할 수 없습니다.

  6. 6

    솔루션에서 새 Prism 프로젝트를 생성 할 수 없습니다.

  7. 7

    솔루션에서 새 Prism 프로젝트를 생성 할 수 없습니다.

  8. 8

    Scala에서 "yield"로 이것을 할 수 있습니까? (조합 벡터를 생성하는 중첩 for 루프)

  9. 9

    while 루프에서 결과를 생성 할 수 없습니다.

  10. 10

    SAS DS2 데이터 단계에서보기를 생성 할 수 있습니까?

  11. 11

    생성되는 이벤트 수에 제한이 있습니까?

  12. 12

    Snorkel : 분류기 훈련과 레이블 지정 기능 생성을 위해 데이터 세트에 다른 기능을 사용할 수 있습니까?

  13. 13

    데이터베이스에 성공적으로 게시 할 때 경고 ()를 발생시킬 수 없습니다.

  14. 14

    다른 이벤트의 한 이벤트에 대해 작성된 JS 함수를 호출 할 수 있습니까?

  15. 15

    Postgresql 함수 내에서 임시 테이블을 생성 할 수 있습니까?

  16. 16

    모든 JRadioButton이 루프에서 생성 된 ButtonGroup에 대해 어떻게 setSelected를 설정할 수 있습니까?

  17. 17

    python 3.7.5 : asyncio.get_event_loop가 이벤트 루프를 생성하지 않았습니다.

  18. 18

    유도 유형의 두 생성자 표현식이 Coq에서 동일한 경우 해당 인수를 기반으로 다시 작성할 수 있습니까?

  19. 19

    NTFS 파티션이 생성 된시기를 확인할 수 있습니까?

  20. 20

    NTFS 파티션이 생성 된시기를 확인할 수 있습니까?

  21. 21

    생성기 함수에서이 값을 바인딩 할 수 있습니까?

  22. 22

    Dynmic JAVA 프로젝트를 생성했으며 데이터베이스에서 JSP로 데이터를 검색 할 수 없습니다.

  23. 23

    내 Android 앱에는 일부 장치에서 Activitynotfoundexception 기반 충돌이 있습니다. 어떻게 다시 생성 할 수 있습니까?

  24. 24

    TTabSheet 컨트롤에서 OnResize 이벤트가 생성되었는지 어떻게 확인할 수 있습니까?

  25. 25

    스트라이프 체크 아웃 : 세션 개체 생성시 메타 데이터를 전달하고 checkout.session.completed 이벤트에서 수신합니다.

  26. 26

    MongoDB에서 데이터를로드하여 EJS로 웹 페이지를 자동 생성 할 수 있습니까?

  27. 27

    ionic에서 프로젝트를 생성 / 시작할 수 없습니다.

  28. 28

    Maybes에서 데이터를 구성 할 수도 있습니다.

  29. 29

    하드 디스크 파일에 대한 ECC 데이터를 생성 할 수있는 방법이 있습니까?

뜨겁다태그

보관