2

私は asyncio と aiohttp に頭を悩ませようとしていますが、数年ぶりにプログラミングをすると、まったく愚かで無能だと感じます。変な禅の方法で、それは一種の美しいものです。しかし、残念ながら、やらなければならない仕事があります。

Web サイトへのサインアップ、データの取得、動作など、Web 上で多くの素晴らしいことを実行できる既存のクラスがあります。そして今、登録するには、これらの小さな働きバチが 100 から 1000 匹必要です。コードはおおよそ次のようになります。

class Worker(object):
    def signup(self, ...):
        ...
        data = self.make_request(url, data)
        self.user_id = data.get("user_id")
        return self

    def make_request(self, url, data):
        response = requests.post(url, data=data)
        return response.json()

workers = [Worker().signup() for n in range(100)]

ご覧のとおり、POST リクエストを行うために requests モジュールを使用しています。ただし、これはブロックしているため、ワーカー N+1 のサインアップを開始する前に、ワーカー N のサインアップが完了するまで待つ必要があります。幸いなことに、Worker クラスの元の作成者 (魅力的にマルクス主義者に聞こえます) は無限の知恵ですべての HTTP 呼び出しをself.make_requestメソッドでラップしたため、Worker 全体を非ブロッキングにすることは、要求ライブラリを非ブロッキングに交換するだけで済みます。 1 つ aaaaand ボブはあなたの叔父ですよね? これは私が得た距離です:

class AyncWorker(Worker):
    @asyncio.coroutine
    def make_request(self, url, data):
        response = yield from aiohttp.request('post', url, data=data)
        return (yield from response.json())

coroutines = [Worker().signup() for n in range(100)]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coroutines))
loop.close()

しかし、これはAttributeError: 'generator' object has no attribute 'get'signupが行うメソッドで を発生させますself.user_id = data.get("user_id")。それ以上に、私はまだきちんとした辞書に労働者を持っていません。asyncio の仕組みを完全に誤解している可能性が高いことは承知していますが、さまざまなドキュメント、David Beazly による驚異的なチュートリアル、およびそれらを理解するのに十分な大量のおもちゃの例を読んで、すでに 1 日を費やしました。この状況に適用するのは簡単です。ワーカーと非同期ループをどのように構成して、100 人のワーカーを並行してサインアップし、最終的にサインアップ後にすべてのワーカーのリストを取得する必要がありますか?

4

1 に答える 1