0
我試圖控制樹莓派上的一些硬件,並運行一個gevent服務器,以通過網絡獲取/設置它們。作爲背景,我應該注意到這不會在公共互聯網上運行,並且永遠不會有超過1個連接。把它想象爲建立一個adsl路由器的管理面板....使用定製的gevent服務器與燒瓶
應用程序將不斷從傳感器讀取並相應地調整輸出。目前,我有這樣的事情:
class MyServer(WSGIServer):
somevalue = 0
def backgroundtask(self, *args, **kwargs):
#note this function should run as frequently as possible
while True:
# do stuff including reading sensors and running motors
self.somemethod(self.somevalue)
gevent.sleep(0)
def __init__(self, listener, handle=None, **kwargs):
WSGIServer.__init__(self, listener, **kwargs)
self.backgroundtask = gevent.spawn(self.backgroundtask)
def application(self, environ, start_response):
status = '200 OK'
headers = [
('Content-Type', 'text/html')
]
yield str(self.somevalue)
這工作好,我可以從傳入的請求設置somevalue
如果我解析ENVIRON,但我想是能夠具有長頸瓶的應用得到並在此服務器上設置somevalue
,以便我可以使用所有標準表單處理內容。
這可能嗎?我怎樣才能使app=Flask(__name__)
成爲服務器的應用程序,而不會丟失訪問服務器的self
屬性?
感謝您的回答 - 我已經投了票,但沒有接受它,因爲它似乎可能容易受到競爭條件的影響,我稱爲backgroundtask的用戶嘗試在用戶同時設置全局輸入。最後,我使用類似於此處描述的演員模型解決了問題:http://sdiehl.github.io/gevent-tutorial/#actors – bjw