2017-12-28 35 views
1

同期方式でデータをアップロードする高速非同期RESTインターフェイス呼び出しを実装しています。現時点では、非同期の方法でPythonページを呼び出し、遅延を測定する非同期フレームワークを構築しようとしています。私は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)) 

:ここ

は、コード(後述のように動作しません)です。私はそれが同時にすべての応答を待つ作るために

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

     responses = asyncio.gather(*tasks) 
     await responses 

と交換した場合、私は下のエラーを取得:

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

私はjupyterノートブックからのコードとしてこれを実行しようとした、そして、実行されなかったので、それを通常のコードにコピーしました。いずれの場合も、Python 3.5で動作しました。残念ながら、私は問題の解決策を見つけることができませんでした。私が収集を試みるとすぐにネットワークにアクセスできないようです。誰もそれがうまくいかない理由を提案していますか?私はどんな提案にも満足しています。

答えて

1

[OK]を、私は私の質問は、私はここに掲載した後、私は唯一の重複を発見した(の複製である疑問に答えを見つけた

ソリューションは、単に使用してクライアントのセッションを初期化することである:。

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

関連する問題