2017-06-07 7 views
0

現在、ファイルをダウンロードするための複数の「非同期」要求を行うためにスレッドを使用しています。 asyncioを使用して、Python 3+にアップグレードしたことがわかりました。http.clientでasyncioを使用できますか?

ssl.SSLContext(protocol = ssl.PROTOCOL_TLS)を使用し、PEMファイルとKEYファイルを渡す必要があります。

私のhttp.clientスクリプトをasyncioと一緒に使用するか、http.clientの機能をaiohttpの機能に変換する必要がありますか?

ボーナス:

いずれかの方法で、誰かがasync def@asyncio.coroutineの間で選択する方法を説明できますか?

は、Infoのサポート:

私のプログラムは、今私たちの最後のシーケンシャルクエリだったものとは、約15の同時要求と並行して動作することを考えるとかなりよく実行されます。しかし、私が取り組んでいる別のプログラムでは、500件のリクエストが並行して送られています。私はthreading.Semaphore()を使用することができましたが、私は大量の要求に対してはasyncioが最適であると読んでいます。

初めてそれをいじり、そう...

私はfollowingを読んでいる(と同様、それの80%は、非ブロッキングソケットのソケット接続のように思える、とのみ適用セクションでは、「調整していますコルーチン ")。

+0

ボーナス:あなたのPythonバージョンは 'async' /' await'構文をサポートしていますか?それを使ってください。デコレータはその構文が整うまでは途中降機でした。 – deceze

+1

はい、asyncioを使用し、aiohttpを使用します。後者はSSLをうまくサポートする必要があります( 'ssl.SSLContext()'をTCPConnectorに渡してClientSessionに渡すことができます)。 –

+0

Python 3.5または(好ましくは)3.6を使用すれば、どこでも 'async' /' await'を使うことができます。 '@ asyncio.coroutine'については忘れてしまいます。 –

答えて

1

aiohttpを使用できます。 http.clientコードをaiohttp client APIに変換する必要があります。 ssl.SSLContext()オブジェクトを再利用できます。そのからクライアントを作成し、TCPConnector() instanceに渡し:あなたはクライアントのセッションの間にコネクタを共有することはできません

import aiohttp 
import ssl 


SSL_CONTEXT = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS) 
SSL_CONTEXT.load_cert_chain(certfile='foo', keyfile='bar') 


async def fetch_url(url): 
    conn = aiohttp.TCPConnector(ssl_context=SSL_CONTEXT) 
    async with aiohttp.ClientSession(conn=connector) as client: 
     async with client.get(url) as response: 
      print(resp.status) 
      print(await resp.text()) 

注意。再利用する場合は、クライアントを再利用してください。

+0

接続はHTTPSである必要があります。なぜなら、 'aiohttp'はこれをサポートしているだけでなく、プロキシを必要とすることもありますか?また、あなたは 'asyncio'をインポートせずに' async'を宣言しました。それはできますか? – madeslurpy

+0

@madeslurpy: 'aiohttp'はSSL接続をうまくサポートしています。[プロキシを使ってサポートします](http://aiohttp.readthedocs.io/en/stable/client.html#proxy-support) )。 'async'構文は言語の一部です。それを有効にするために' asyncio'をインポートする必要はありません。 –

+0

なぜ 'asyncio'をインポートする必要があるのですか?私が読んでいるすべての例は、 'get_event_loop()'と 'run_until_complete()'を呼び出します。ファイルをダウンロードするために500件の同時リクエストを同時に行う必要はありませんか? – madeslurpy

関連する問題