私はPubnubフィードを聞いてメッセージをデータベースに保存するDjangoアプリを構築しています。アプリのapps.py
のAppConfig
のready()
メソッドでpubnubリスナーを作成します。 Herokuの上の私のアプリを起動する際にPubnubはいつもDjangoアプリでタイムアウトします
は、私はDjangoはのAppConfigプロセスをクリーンアップしたいとそこにぶらぶらpubnubオブジェクトがあることを動揺なっている疑いがある
2017-04-26T02:17:50.038060+00:00 heroku[web.1]: Error R12 (Exit timeout) -> At least one process failed to exit within 30 seconds of SIGTERM
2017-04-26T02:17:50.038060+00:00 heroku[web.1]: Stopping remaining processes with SIGKILL
2017-04-26T02:17:50.134619+00:00 heroku[web.1]: Process exited with status 137
本当に役に立たないエラーが発生します。それは問題ですか?どうすれば修正できますか?
私もそれを参照してください(少なくとも暗黙的に例で)Heroku recommends using the twisted interface.私はそうではないのですか?
ここに関連するコードです:
私はPubnub's hello world exampleに基づいmypubnub.pyを作成:
from pubnub.pubnub import PubNub
from pubnub.pnconfiguration import PNConfiguration
from pubnub.callbacks import SubscribeCallback
class MySubscribeCallback(SubscribeCallback):
def presence(self, pubnub, presence):
pass
def status(self, pubnub, status):
pass
def message(self, pubnub, message):
pass # I'll actually do the storage here later
def create_pubnub():
pnconf = PNConfiguration()
pnconf.subscribe_key = 'sub-c-blargyblargblarg'
pnconf.publish_key = 'pub-c-blargyblargblarg'
pubnub = PubNub(pnconf)
pubnub.add_listener(MySubscribeCallback())
pubnub.subscribe().channels('achannel').execute()
return pubnub
私はdjango.appsからapps.py
でpubnubのものがのAppConfig
from .mypubnub import create_pubnub
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
pn = create_pubnub()
私はDjangoの専門家でもPythonでもありませんが、apps.pyの有効範囲/ライフサイクルは何ですか?それがウェブリクエストの期間だけ実行されている場合、サブスクライブは長期実行(常にオン)プロセスなので、それは問題になります。それが問題かもしれないかどうか私に教えてください。 –
@CraigConover私はそれがかなりおそらく問題だと思います。私はDjangoも新しく、Pythonのほとんどのものとは異なり、apps.pyまたはAppConfigオブジェクトのスコープは明示的ではありません。永続的な格納場所がDjangoのどこにあるのかはわかりません。この時点で他の人が体重を増やすことができれば、それは本当に役に立ちます。 – ericksonla
これを読んでくださいhttp://stackoverflow.com/questions/32795227/what-is-the-purpose-of-apps-py-in-django-1-9しかし、一般に、あなたがあなたのサーバから購読しているなら、それは赤旗。サーバーからの購読は、標準ではなく例外です。ベストプラクティスは、PubNub Network内からパブリッシュされた各メッセージをサーバーにリスンするのではなく、[PubNub BLOCKS](https://www.pubnub.com/docs/blocks/introduction)を使用してPOSTすることですチャネルまたはすべてのチャネル。 –