簡體   English   中英

如何在Python中使用同一腳本運行2台服務器

[英]How to run 2 servers from the same script in Python

我正在構建一個解決方案,該解決方案依賴於現場IOT設備的發布/訂閱事件來啟動一些處理。 就我的目的而言,我使用Flask as來運行我的主應用程序。 然后,我運行mqtt客戶端以連接到MQTT服務器並偵聽事件。

當我使用python app.py運行我的主Flask app.py時, python app.py同時啟動Flask服務和MQTT客戶端。 但是,當我嘗試與gunicorn一起運行時,它只會啟動Flask服務,而不會啟動MQTT Client。

我可以使用哪種生產級服務(如果不是傻瓜)來同時運行這兩項服務,以及如何使用它?

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)

Flask只是Python的微框架。 如果要通過python同時運行多方法,則需要使用多線程編程。

我閱讀了更多Flask文檔,發現Flask支持多線程並發。

你試一試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM