6

通常の Django サイトを実行しています。さらに、Jabber プレゼンス通知をリッスンし、Django の ORM を使用して Django DB を更新する別のねじれたプロセスがあります。

これまでのところ、対応する Django モデルを呼び出すだけで機能します (設定環境を正しくセットアップした後)。ただし、これは Twisted アプリをブロックします。これは私が望んでいるものではありません。

私はツイストに慣れていないので、遅延を使用してノンブロッキングの方法で(ORMを介して)Django DBにアクセスする最善の方法は何でしょうか。

  1. deferredGenerator ?
  2. twisted.enterprise.adbapi ? (ORMを回避しますか?)
  3. ???

プレゼンス メッセージが解析される場合、jid_str を持つユーザーがオンライン/オフラインであることを Django DB に保存します (Django モデルを使用UserProfile)。私はその機能でそれを行います:

def django_useravailable(jid_str, user_available):
    try:
        userhost = jid.JID(jid_str).userhost()
        user = UserProfile.objects.get(im_jabber_name=userhost)
        user.im_jabber_online = user_available
        user.save()
        return jid_str, user_available
    except Exception, e:
        print e
    raise jid_str, user_available,e

現在、私はそれを呼び出す:

d = threads.deferToThread(django_useravailable, from_attr, user_available)
d.addCallback(self.success)
d.addErrback(self.failure)
4

3 に答える 3

1

「通常の Django サイトを実行しています。」

おそらくmod_wsgiなどを使用してApacheの下で。

Apache に埋め込まれた mod_wsgi を使用している場合、Apache はマルチスレッドであり、Python スレッドは Apache のスレッドにマッシュされていることに注意してください。何がブロックされているのかを分析すると、厄介な問題が発生する可能性があります。

mod_wsgi をデーモン モードで使用している場合 (そうするべきです)、Django は別のプロセスです。

この設計パターンを継続して、「jabber リスナー」を別のプロセスにしないでください。

このプロセスを複数のサーバーのいずれかで実行したい場合は、init.rcまたはから開始してcronください。

これは別のプロセスであるため、注意を引くために競合することはありません。Django プロセスは迅速に実行され、Jabber リスナーは独立して実行されます。

于 2009-10-29T13:30:23.953 に答える
1

現在の方法として説明した方法を使用して成功しました。ほとんどの SQL ライブラリにはブロッキング API があるため、ツイスト DB API はフードの下でスレッドを使用することがドキュメントを読むとわかります。

フィールドの電力モニターからのデータを保存するねじれたサーバーがあり、時々サブスレッドを起動し、Django 保存コードを呼び出すことによってそれを行います。私のライブ データ収集パイプラインについて詳しく読むことができます(これはブログ リンクです)。

サブスレッドを起動していて、まだブロックしていると言っていますか?

于 2009-11-04T23:42:42.893 に答える
0

DjangoORMを使用するTwistedアプリを実行しています。私はそれを延期していません。私はそれが間違っていることを知っていますが、まだ問題はありませんでした。

于 2009-11-05T21:20:12.983 に答える