zab*_*mba 5 python wsgi python-multithreading flask socket.io
从python-socketio的此片段开始
import socketio
import eventlet
from flask import Flask, render_template
sio = socketio.Server()
app = Flask(__name__)
@app.route('/')
def index():
"""Serve the client-side application."""
return render_template('index.html')
@sio.on('connect')
def connect(sid, environ):
print('connect ', sid)
@sio.on('my message')
def message(sid, data):
print('message ', data)
@sio.on('disconnect')
def disconnect(sid):
print('disconnect ', sid)
if __name__ == '__main__':
# wrap Flask application with socketio's middleware
app = socketio.Middleware(sio, app)
# deploy as an eventlet WSGI server
eventlet.wsgi.server(eventlet.listen(('', 8000)), app) <====
Run Code Online (Sandbox Code Playgroud)
代码的最后一行在那儿阻止了我的代码,但我想将其作为守护程序运行并继续执行更多逻辑。那有可能吗?
我已经阅读了这篇文章,并尝试threading按建议使用,但我担心这样做不正确。
wst = threading.Thread(target=eventlet.wsgi.server(eventlet.listen(('', 7000)), app))
wst.daemon = True
wst.start()
Run Code Online (Sandbox Code Playgroud)
有指针吗?
我试过了
# wrap Flask application with socketio's middleware
app = socketio.Middleware(sio, app)
# deploy as an eventlet WSGI server
# eventlet.wsgi.server(eventlet.listen(('', 7000)), app)
wst = threading.Thread(target=self.serve_app, args=(app))
wst.daemon = True
wst.start()
def serve_app(app):
eventlet.wsgi.server(eventlet.listen(('', 7000)), app)
Run Code Online (Sandbox Code Playgroud)
但
@4000000056a6bbe61979723c Exception in thread Thread-1:
@4000000056a6bbe619797df4 Traceback (most recent call last):
@4000000056a6bbe6197981dc File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
@4000000056a6bbe6197985c4 self.run()
@4000000056a6bbe6197989ac File "/usr/lib/python2.7/threading.py", line 763, in run
@4000000056a6bbe619798d94 self.__target(*self.__args, **self.__kwargs)
@4000000056a6bbe61979917c TypeError: serve_app() argument after * must be a sequence, not Middleware
@4000000056a6bbe6197a164c
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法?
更改了一点代码
wst = threading.Thread(target=self.serve_app, args=(sio))
wst.daemon = True
wst.start()
Run Code Online (Sandbox Code Playgroud)
def serve_app(sio):app = socketio.Middleware(sio,app)eventlet.wsgi.server(eventlet.listen(('',7000)),app)
如建议通过一个元组,(app,)但现在出现此错误
@4000000056a7543717fb2324 File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
@4000000056a7543717fb270c self.run()
@4000000056a7543717fb270c File "/usr/lib/python2.7/threading.py", line 763, in run
@4000000056a7543717fb2af4 self.__target(*self.__args, **self.__kwargs)
@4000000056a7543717fb2edc TypeError: serve_app() takes exactly 1 argument (2 given)
Run Code Online (Sandbox Code Playgroud)
这看起来像我缺少Python语法
我忘记了 (self,
wst = threading.Thread(target=self.serve_app, args=(sio,app))
wst.daemon = True
wst.start()
def serve_app(self, _sio, _app):
app = socketio.Middleware(_sio, _app)
eventlet.wsgi.server(eventlet.listen(('', 7000)), app)
Run Code Online (Sandbox Code Playgroud)