import flask
import time
app = flask.Flask(__name__)
@app.route("/")
@app.route("/timecount")
def start():
#同事要啟動擷取監控
return start
@app.route("/timestop")
def end ():
#同事要關閉擷取監控
return timestop
if __name__ == '__main__':
host,port = "127.0.0.2",3000
app.run(host,port)
#接下來下面要跑一直跑監控程式
"""
監控程式,收到要開始跟結束把中間擷取的監控狀態回傳
"""
因為一打開flask當server就會整個變成阻塞狀態,
所以請問如何在當server時既能接收API又不影響主程,
並把value傳達到主程讓他可以隨時開始與停止?
更新:
就是我要用python做一個監控系統,
同時要開放API功能讓同事可以透過API擷取監控內的狀態回傳。
你需要讓你要跑的程式由其他 線程或是執行緒 執行。
簡單的辦法就是你自己再寫一個Python然後Flask下指令給另外一個程式,可能透過 socket 或類似的方法。
所以監控是另一個程式跑的,他會維護監控的訊息和狀態,Flask是對他下命令的角色。
from flask import Flask
import time
import asyncio
app = Flask(__name__)
class MonitorService:
counter = 0
async def run(self):
while True:
await asyncio.sleep(1)
self.counter += 1
@property
def show(self):
return self.counter
ms = MonitorService()
@app.route("/")
def hello_world():
print(ms.show)
return f"<p>{ms.show}</p>"
async def main():
loop = asyncio.get_event_loop()
host,port = "127.0.0.2",3000
app_task = loop.run_in_executor(None, lambda:app.run(host,port))
service_task = asyncio.create_task(ms.run())
await asyncio.gather(service_task, app_task)
if __name__ == '__main__':
asyncio.run( main())
這樣?
雖然我也覺得該用2隻程式跑比較正確。
可以轉個方向,在Flask內執行非同步的工作。要實施監控,可寫一支爬蟲程式不斷瀏覽http://localhost:5000/start ,即可監控網站。
範例如下:
# pip install flask[async]
from flask import Flask
import time
import asyncio
app = Flask(__name__)
async def task1(expr):
await asyncio.sleep(1) #time.sleep(1)
return eval(expr)
# not work
@app.route("/async/<expr>")
async def getdata(expr):
data = await task1(expr)
print("the answer =", data)
return {"input": expr, "answer": data}
@app.route('/')
def index():
return 'Hello World'
if __name__ == '__main__':
app.run()