0

これは今までに出てきたのだろうか?

GitHub Enterprise インスタンスから大量の情報をダウンロードするアプリがあります (現在 github3.py を使用していませんが、github3.py を使用するように変換することを考えています)。基本的に、189 のリポジトリをクロールし、各リポジトリに対して、ブランチ、タグ、およびコミットをプルします。非常に多くの HTTP リクエストを連続して実行する必要があるため、これは明らかにかなり遅いです。

github3.py がgrequestオブジェクトを返すようにして、grequests にリクエストを並行して実行させることができるのだろうか? あるいは、github3.py で「同時実行レベル」を設定し、リクエストを並行して処理できるようにすることで、grequest をラップして非表示にすることもできます。または多分コンテキストマネージャ:

with github3.parallel():
    tags = pull_tags(git_repo)
    branches = pull_branches(git_repo)

並列化は非常に異なるパラダイムであるため、並列化でうまく機能する API を考え出すのは非常に困難な場合があることを認識しています。これが、私が課題トラッカーをこれでごちゃごちゃにしたくなかった理由です。

4

1 に答える 1

1

これは非常に難しいでしょう。grequestsまた、リクエストの他のラッパーは、Session API を提供しません (リクエストのセッションは本来あるべきほどスレッドセーフではないため、つまり、そうでないためです)。彼らがこれを行う方法を提供した場合、それはうまくいくかもしれません. これを行う最善の方法はGitHub、各ワーカー greenlet/スレッドに 1 つずつ、複数のインスタンスを作成し、それらを各スレッドのコンテキストで使用することです。そうすることで、グリーンレットごとにセッションが作成され、操作が安全になります (スレッド間でオブジェクトを渡さない限り)。

于 2014-11-02T04:09:38.463 に答える