Estoy creando una aplicación Django para escuchar un feed de Pubnub y almacenar los mensajes en una base de datos. Creo un oyente pubnub en el método ready() de AppConfig de apps.py de mi aplicación.
Al iniciar mi aplicación en Heroku, aparece el error realmente inútil
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 137Sospecho que Django quiere limpiar el proceso de AppConfig y está molesto porque hay un objeto pubnub dando vueltas por ahí. ¿Es ese el problema? ¿Cómo lo soluciono?
También veo que (al menos implícitamente por ejemplo) Heroku recomienda usar la interfaz retorcida. ¿Es malo que no lo sea?
Aquí está el código relevante:
Creé un mypubnub.py basado en el ejemplo hello world de Pubnub :
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 Hago una instancia de esas cosas de pubnub en apps.py desde django.apps import AppConfig
from .mypubnub import create_pubnub class MyAppConfig(AppConfig): name = 'myapp' def ready(self): pn = create_pubnub()Si bien es algo que algunos clientes de PubNub hacen con éxito, suscribirse desde el lado del servidor suele ser la excepción y no la regla. Sin embargo, tiene su caso de uso adecuado.
En este caso, la mejor práctica sería usar BLOQUES de PubNub para POST cada mensaje que se publica desde la red de PubNub a su servidor en lugar de que su servidor escuche en un canal o en todos los canales para hacer lo mismo.