1、如下代碼,啟動的時候python app.py會報如題的錯誤
app.py
#!/user/bin python # -*- coding:utf-8 -*- import os from datetime import timedelta from flask import Flask, session, url_for, render_template, make_response, request, redirect import zerorpcimport multiprocessing APP = Flask(__name__) APP.secret_key = os.urandom(24) APP.permanent_session_lifetime = timedelta(seconds=30 * 24 * 60 * 60)
class RPCServer(object):
def hello(self, filename):
return filename
@APP.route('/') @APP.route('/index') def index(): return render_template('index.html') @APP.route('/ok.htm',methods=['GET', 'POST','HEAD']) def ok(): return render_template('ok.htm') @APP.route('/test') def test(): session.permanent = True _str = '' if 'name' in session: _str = session['name'] if 'nick' in session: _str += '---' + session['nick'] #print session return _str def runWeb(): print ("start webapp") APP.run(host='0.0.0.0', port= 5000, debug=True, threaded=True) def runRPC(): #print "start rpc" s = zerorpc.Server(RPCServer()) s.bind("tcp://0.0.0.0:4242") s.run() if __name__ == "__main__": p1 = multiprocessing.Process(target = runWeb) p2 = multiprocessing.Process(target = runRPC) p1.start() p2.start() p1.join() p2.join() # p1.run() # p2.run() # p1.join() # p2.join()
2、錯誤信息:
3、查看進程情況:
4、lsof -i:4242 、lsof -i:5000查看端口情況,發現rpc服務並沒有啟動
5、但是如果關掉flask的debug模式,就沒有問題
6、原因是:flask的debug模式會額外開啟一個進程,這個進程負責監控代碼是否發生變化,如果發生變化,會自動重啟應用,使新修改代碼立即自動生效;因此我猜想,是這個進程破壞了rpc服務的啟動。
DEBUG模式下flask多開一個線程來監視項目的變化。
The first thing it does is start the main function in a new thread so it can monitor >the source files and restart the thread when they change.
如果你想要避免加載兩次,應該設置app.run(debug=True, use_reloader=False)
參考:
1、https://github.com/ipython/ipython/issues/6109
2、https://segmentfault.com/q/1010000000446372
3、