2017-11-14 1 views
1

Ich baue eine Lösung, die auf pub/sub Ereignisse von IOT Geräten im Feld einige Verarbeitung, kick off abhängt. Für meine Zwecke verwende ich Flask, um meine Hauptanwendung zu betreiben. Ich führe dann den mqtt Client aus, um mich mit einem MQTT-Server zu verbinden und auf Ereignisse zu warten.Wie 2 Server aus dem gleichen Skript ausgeführt werden sollen in Python

Als ich mein Haupt Flask app.py python app.py mit laufen beginnt es sowohl den Flask-Dienst und das MQTT-Client. Wenn ich jedoch versuche, mit Gunicorn zu starten, wird nur der Flask-Dienst gestartet, der MQTT-Client wird jedoch nicht gestartet.

Welche Produktion Grad-Dienst (wenn nicht gunicorn) kann ich haben, verwenden beide diese beiden Dienste laufen und wie es zu benutzen?

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) 

Antwort

0

Flask ist nur ein Mikroframework für Python. Wenn Sie mehrere Methoden gleichzeitig mit Python ausführen möchten, müssen Sie Multi-Threading-Programmierung verwenden.

las ich etwas mehr Flask Dokument und festgestellt, dass Flask multithreaded Parallelität unterstützt.

nur versuchen:

app.run(host='0.0.0.0',port=5000,debug=True, threaded = True) 
+0

Ich brauche die Flasche App nutzen zu können greifen, da es Python RQ Aufgaben verknüpft sind, die ON_MESSAGE von MQTT Broker die Warteschlange gestellt werden müssen. Wenn Sie jedoch expliziter sein können, wie dies zu tun ist, kann ich es versuchen. – user1048839

+0

Versuch app.run (Gewinde = True) –

+0

app.run (host = '0.0.0.0', port = 5000, debug = True, Gewinde = True) –

Verwandte Themen