我正在构建一个解决方案,它依赖于来自现场物联网设备的发布/订阅事件来启动一些处理。出于我的目的,我使用flaskas来运行我的主应用程序。然后运行mqtt客户机连接到mqtt服务器并侦听事件。在
当我打开主瓶的时候应用程序副本它使用python app.py同时启动Flask服务和MQTT客户机。但是,当我尝试使用gunicorn运行时,它只启动Flask服务,而不启动MQTT客户机。在
我可以使用什么生产级服务(如果不是gunicorn)来运行这两个服务,以及如何使用它?在import logging, json, requests, os
import paho.mqtt.client as mqtt
from flask import Flask, request, url_for
from flask_restful import reqparse, abort, Api, Resource
from logging.handlers import SysLogHandler
from logging import StreamHandler
from flask.ext.superadmin import Admin, BaseView, model
from redis import Redis
from rq import Queue
from task import Task
from dateutil.relativedelta import relativedelta
from datetime import datetime, date
..
..
from commons import db, bootstrap
app = Flask(__name__)
api = Api(app)
bootstrap.bootstrap_app(app)
#Setup (Redis) Queue store
q = Queue(connection=Redis())
#Intialize task instance
task = Task(app)
..
...
@app.before_request
def log_request_info():
app.logger.debug('Headers: %s', request.headers)
app.logger.debug('Body: %s', request.get_data())
#API resource routing
api.add_resource(Test, '/test')
def session_report(client, userdata, message):
print message.topic, message.payload
# Redirect to session_report endpoint
with app.test_request_context():
url = 'http://localhost:5000'+url_for('sessionreport', _external=False)
headers = {'content-type': 'application/json'}
response = requests.request("POST", url, data=message.payload,
headers=headers)
def process_ack(client, userdata, message):
try:
user = User()
user.update_account(account_number=next(iter(json.loads(message.payload))))
except Exception, e:
print e
def publish_accounts(client):
user_obj = User()
users = {user.id: user.account_number for user in user_obj.get_users()}
client.publish('accounts', payload=json.dumps(users), qos=1, retain=True)
# paho callbacks
def on_connect(client, userdata, flags, rc):
print "CONNECTED!", str(rc)
# Subscribe to topis(s) here
client.subscribe("mine/#")
client.subscribe("session/#")
client.subscribe("ack")
# Add callbacks to subscribed topics
client.message_callback_add("session/#", session_report)
client.message_callback_add("ack", process_ack)
# Publish latest list of accounts
publish_accounts(client)
def on_subscribe(client, userdata, mid, granted_qos):
print "Subscribed: ", str(mid), str(granted_qos)
def on_message(client, userdata, msg):
print msg.topic, msg.payload
def on_publish(client, userdata, mid):
print "PUBLISHED!"
app.logger.info('PUBLISHED : {} -- {}'.format(mid, userdata))
if __name__ == '__main__':
handler = StreamHandler() #SysLogHandler()
handler.setLevel(logging.DEBUG)
app.logger.addHandler(handler)
client = mqtt.Client()
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.on_message = on_message
client.connect("localhost", 1883, 60)
client.loop_start()
app.run(debug=True, host='0.0.0.0', port=5000)