2017-12-28 42 views
1

동기식으로 데이터를 업로드하려는 빠른 비동기 REST 인터페이스 호출자를 구현하고 있습니다. 지금은 비동기 방식으로 파이썬 페이지를 호출하고 지연을 측정하는 비동기 프레임 워크를 빌드하려고합니다. 내가aiohttp/asyncio를 사용한 비동기 HTTP 호출이 "호스트에 연결할 수 없습니다 [네트워크에 연결할 수 없습니다."]

await perform_call(session) 

를 사용하고 있지만, 분명히 asynchonous 전화를 나누기로 제대로 한 일

import aiohttp 
import asyncio 
import async_timeout 
from timeit import default_timer as timer 

async def fetch(session, url): 
    start = timer() 
    with async_timeout.timeout(10): 
     async with session.get(url) as response: 
      date = response.headers.get("DATE") 
      end = timer() 
      delay = end - start 
      print("{}:{} with delay {} s".format(date, response.url, delay)) 
      return await response.read() 

async def bound_call(semaphore, session, url): 
    async with semaphore: 
     await fetch(session, url) 

async def perform_call(session): 
    sem = asyncio.Semaphore(1000) 
    html = await bound_call(sem, session, 'http://python.org') 

async def perform_calls(n): 
    tasks = [] 
    async with aiohttp.ClientSession() as session: 
     for i in range(n): 
      task = perform_call(session) 
      tasks.append(task) 

     responses = asyncio.gather(*tasks) 
     await responses 

call_number = 10 

loop = asyncio.get_event_loop() 
loop.run_until_complete(perform_calls(call_number)) 

: 여기

코드 (아래에 설명 된대로 작동하지 않는)입니다. , 나는 jupyter 노트북의 코드로 이것을 실행하려고

aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host python.org:80 ssl:False [Network is unreachable] 

, 그리고 : 나는 같은 시간에 모든 응답을 기다리고 만들기 위해

  task = perform_call(session) 
      tasks.append(task) 

     responses = asyncio.gather(*tasks) 
     await responses 

로 교체하면, 나는 오류가 아래 얻을 실행되지 않았으므로 정상 코드로 복사됩니다. 두 경우 모두 파이썬 3.5에서 돌아갔다. 불행히도, 나는 문제에 대한 해결책을 찾지 못했습니다. 수집을 시도하자마자 네트워크 액세스가없는 것 같습니다. 아무도 왜 그것이 작동하지 않는 제안을합니까? 나는 어떤 제안이라도 기쁘게 생각합니다. .

답변

1

좋아, 내가 질문에 대답은 내 질문에 내가 여기에 게시 후 난 단지 중복을 발견 (의 중복 발견

을이 솔루션은 사용하여 클라이언트 세션을 초기화하는 것입니다

import socket # together with your other imports 

conn = aiohttp.TCPConnector(
     family=socket.AF_INET, 
     verify_ssl=False, 
    ) 

    # Create client session that will ensure we dont open new connection 
    # per each request. 
    async with aiohttp.ClientSession(connector=conn) as session: 

중복을 기반으로 한 설명 : 클라이언트 세션은 연결을위한 리졸버로 기본 AsyncResolver 대신 연결을 사용합니다.이 리졸버는 기본 리졸버였습니다.이 문제는 AsyncResolver가있는 ipv6이있는 도메인과 관련이있는 것 같습니다. 문제가 있으므로 해결책은 단순히 ipv4에 가족을 지정하는 것입니다 add 우리는 family=socket.AF_INET으로 무엇을 할 지 재검토합니다.

중복 : python 3.5 asyincio and aiohttp Errno 101 Network is unreachable