에 바닐라 발생기에 비동기 발전기를 병합합니다. 내가 그들을 발견하는 유일한 방법은 iterable 및 생성기를 반환하는 이벤트 루프를 통해 있기 때문입니다. 나 간단한 예제로 이것을 설명하자 어떻게 파이썬 3.5 내가 비동기 발전기를 결합하는 데 문제가 실제로이를 실행하는거야
이의 내가 (내가 목적의 API를 사용하지 않는)을 긁어 구글을 검색하는 기능 GOOGLE_SEARCH 있다고 가정 해 봅시다. 검색 문자열을 받아서 검색 결과의 생성자를 반환합니다. 이 생성기는 페이지가 끝났을 때 끝나지 않고 다음 페이지로 계속 이동하여 기능을 계속합니다. 따라서 GOOGLE_SEARCH 함수는 가능성이 거의 무한 발전기를 돌려줍니다 (기술적으로 항상 종료됩니다하지만 종종 당신이 구글에서 검색을 위해 명중의 수백만을 얻을 수 있습니다) 그래서 지금 내가 나를 수있는 기능을 만들고 싶어,def google_search(search_string):
# Basically uses requests/aiohttp and beautifulsoup
# to parse the resulting html and yield search results
# Assume this function works
......
좋아 여러 google_search 생성기를 반복합니다. 다음과 같이하고 싶습니다.
def google_searches(*search_strings):
for results in zip(google_search(query) for query in search_strings):
yield results
이렇게 간단한 방법으로 google_searches를 풀고 내 결과를 얻을 수 있습니다. 그리고 위의 코드는 잘 작동하지만 합리적으로 많은 수의 검색에서는 매우 느립니다. 이 코드는 첫 번째 검색에 대한 요청을 보낸 다음 두 번째 검색에 대한 요청을 최종적으로 전송할 때까지 결과를 산출합니다. 나는 이것을 (많은) 속도를 올리고 싶다. 내 첫 번째 아이디어는 비동기 함수로 google_searches를 변경하는 것입니다 (파이썬 3.6.3을 사용 중이며 await/async 등을 사용할 수 있습니다). 이것은 비동기 생성기를 생성하지만 다른 비동기 함수 나 이벤트 루프에서만 실행할 수 있습니다. 그리고 run_until_complete에 이벤트 루프에서 실행 (loop.gather는 (...)) 대신 목록에서 개최 너무 많은 검색 결과가 아마 방법이 같은 목적을 패배 일반 발전기의 결과 목록을 반환합니다.
는 바닐라 생성 할 필요 여전히 요청을 실행하는 비동기 동안로 (바람직하게는 비동기 코드 아무것도하지만이 환영을 사용)하는 방법이 google_searches 빠르게 작동 할 수 있습니까? 미리 감사드립니다.
왜 downvote? 내 질문에 적절하게 질문하지 않거나 구체적이지 않은가? 나는 downvote 상관 없어하지만 난 그것을 개선 할 수 있도록 잘못 알고 싶습니다. 감사. –