5

私たちが取り組んでいるプロジェクトには、同期アプリケーション (短命) と非同期 Twisted アプリケーション (長命) が含まれます。データベースをリファクタリングし、API モジュールを構築して、そのモジュール内のすべての SQL を分離します。その API を作成して、同期アプリケーションと非同期アプリケーションの両方で使用できるようにしたいと考えています。同期アプリケーションの場合、MySQLdb を使用するのと同じように、データベース API への呼び出しでデータを返す (ブロックする) だけにしたいのですが、非同期アプリケーションの場合は、同じ API 関数/メソッドへの呼び出しをブロックしないで、おそらく返すようにしたいと思います。延期。これを行うために私に提供するヒント、提案、またはヘルプはありますか? 前もって感謝します、ダグ

4

4 に答える 4

3

twined.enterprise.adbapiは進むべき道のようです-それがあなたの要件に合わないと思いますか?もしそうなら、その理由を説明できますか?

于 2009-11-10T06:26:54.753 に答える
1

Twisted内では、基本的に、Deferred(Twisted DBレイヤーなど)を返し、その結果を待機して返す関数のラッパーが必要です。ただし、ビジーウェイトはできません。これは、リアクターサイクルを使い果たしており、Twisted非ブロッキング待機を使用してタスクが完了するかどうかを確認するのはおそらく非効率的です。

inlineCallbacksまたはdeferredGeneratorは問題を解決しますか?彼らは現代のツイストを必要とします。 twinedmatrixドキュメントを参照してください

def thingummy():
   thing = yield makeSomeRequestResultingInDeferred()
   print thing #the result! hoorj!
thingummy = inlineCallbacks(thingummy)

もう1つのオプションは、同じSQLテンプレートを実行する2つのメソッドを用意することです。1つはブロックするrunInteractionを使用し、もう1つはDeferredを返すrunQueryを使用しますが、同じことを行うコードパスが多くなります。

于 2009-11-11T00:17:49.403 に答える
0

継続渡しスタイルからページを借りることを検討しましたか? スタックレス Pythonは、使用している場合は継続を直接サポートしており、このアプローチはすでにある程度の関心を集めているようです。

于 2009-11-10T03:26:44.513 に答える
0

私が見たすべてのデータベース ライブラリは、頑固に同期しているようです。

Twisted.enterprise.abapi は、スレッドを使用して接続プールを管理し、基礎となるデータベース ライブラリをラップすることで、この問題を解決しているようです。これは明らかに理想的ではありませんが、うまくいくと思いますが、実際に自分で試したことはありません。

理想的には、sqlalchemy と twisted を統合する何らかの方法があるでしょう。それを行うと主張するこのプロジェクトnadbapiを見つけましたが、2007 年以来更新されていないようです。

于 2009-11-12T08:54:48.863 に答える