私は、サードパーティのWeb APIからリアルタイムデータを取得し、それをMySQLデータベースに入れ、HTTP/JSON APIで利用できるようにするWebバックエンド/ APIプロバイダを開発中です。イベントレット/一般的な非同期入出力タスク精度
私はフラスコでAPIを提供しており、SQLAlchemy Coreを使用してDBを操作しています。
リアルタイムデータ取得のために、リクエストを送信し、返されたxmlをPythonのdictに解析して返し、サードパーティのAPIをラップする関数を持っています。これらのAPIラッパーを呼び出します。
これらの関数を、それぞれのデータを取得する他のメソッド内で呼び出し、必要に応じて(タイムゾーン変換など)処理してDBに格納します。私たちはこれらのプロセッサーを呼び出します。
私は特に非同期I/Oとイベントレットについて読んできました。私は非常に感銘を受けました。
私は、コードをつかんで自分のデータでそれを組み込むつもりですが、私は最初のいくつかの質問を持っている:それはモンキーパッチのすべてに私のために安全な
のですか?私はフラスコ、SQLAlchemyと他のlibsの束を持っていると考えて、猿のパッチ(不本意なバインディングがないと仮定)の欠点はありますか?
タスクを分割する必要がある粒度はなんですか?私はプロセッサを定期的に起動するプールを作成することを考えていました。次に、プロセッサーがAPIラッパーを呼び出す部分に到達すると、APIラッパーは、eventlet.green.urllib2を使用して実際のHTTPデータを取得するためのGreenPileを開始します。これは良いアプローチですか?
- タイムアウト - greenthreadsがハングしていないことを確認したい。イベントレットを設定するのは良いアプローチですか?グレープフルーツごとに10-15秒の時間がかかりますか?
参考までに約10種類のリアルタイムデータがあり、プロセッサは5〜10秒ごとに生成されます。
ありがとうございます!
ご意見ありがとうございます。私はFlaskとAsync I/Oを混在させないことに同意します。私の質問からは明らかにならないはずですが、API(Flask)は非パッチ非同期I/Oプロセスで動作します。データグラバーは、単純化の目的のためにSQLAlchemy Core(ORMではなく)を使用してdbに書き込む、パッチ適用されたプロセスで実行されます。 – user1094786
この場合、あなたはすでにこのようにしています。私はあなたが本当にデータグラバーのための非同期を必要とするかどうか思います。並行性の他の方法(マルチプロセッシング、セロリなど)を使用する方がよい場合があります。特に、データグラバーがCPUを大量に使用する場合は特にそうです。セロリの場合は –
+1。タスクはそれのための良い候補のように見えます。 – Tisho