외부 전자 장치를 제어/측정하기 위해 RPI3을 설정하고 있습니다. 그것은 Flask를 실행하는 mod_wsgi와 함께 Apache2 서버를 사용합니다. 컨트롤의 모든 코드는 타이머이라는 별도 클래스에 있으며 __init__.py Flask 스크립트에서 초기화됩니다. 컨트롤의 주 루프는 다른 스레드에 있습니다.Flask 스크립트에 대한 새 스레드 시작 mod_wsgi 사용 안함
문서에서이 기능을 찾을 수 없지만 요청에서 드문 드문 한만큼 서버가 동일한 __init__.py에서 실행되는 것처럼 보입니다. 새 요청이있을 때 스크립트가 사용 중이면 서버는 별도의 스레드에서 새 요청을 시작합니다. 이런 일이 발생하면 원래의 클래스 인스턴스가 "메모리에서 손실"됩니다. 왜냐하면 거기에서 요청을 처리하는 현재 스크립트는이를 모르기 때문입니다.
내 솔루션은 실행중인 개체에 대한 모든 정보를 json 파일에 작성하고 타이머 클래스와 __init__.py 클래스를 모두 읽고 쓰기로 설정했습니다. 내 의견으로는 약간 꼴 사납다. 확실히 이것은 이전에 해결되었습니다.
그래서 나는이 두 가지 중 하나를 수행 하시겠어요 :
- 사용 안 함이 기능을 동일한 스크립트는 항상 요청을 처리 때문에, 무슨 일이 있어도. (이것은 많은 오류를 만들어내는 것처럼 보입니다.)
- (권장) 메모리에서 "손실"객체 (측정을 실행하는 스레드)에 액세스하고 새 스레드의 스크립트에서 직접 제어합니다.
이 작업을 수행 할 수 있습니까?
다음은 간단한 코드입니다.
from flask import Flask, render_template, request
import time
import threading
class Timer:
def __init__(self):
#setup variables
pass
def mainloop(self):
while True:
data = readSensor()
writeFile(data)
time.sleep(5)
app = Flask(__name__)
t = Timer()
@app.route('/', methods=['GET', 'POST'])
def homepage():
if request.method == 'POST':
return render_template("main.html")
elif request.method == 'GET':
return render_template("main.html")
@app.route('/_submit')
def submit():
t = threading.Thread(target=t.mainloop)
t.start
if __name__ == "__main__":
app.run()
당신이 mod_wsgi에 데몬 모드를 사용하고 처리? 만약 그렇다면, 모든 요청이 하나의 프로세스에서 처리되는 것이 기본입니다. Apache/mod_wsgi를 임베디드 모드로 사용하고있는 것처럼 들리 겠지만, 아파치가 프로세스/스레드의 수를 지정하여 요청이 다른 프로세스에서 처리 될 수 있습니다. mod_wsgi 구성을 표시하십시오. –
각 스레드가 자체 타이머 인스턴스를 갖도록 스레드 로컬 데이터를 사용해야하는 경우 일 수도 있습니다. 또는 일종의 요청 ID 또는 세션 ID로 키 구조화 된 데이터 구조를 유지해야합니다. 당신의 설명은 조금도 혼란 스럽기 때문에 어떤 것도 제안하기가 어렵습니다. 어쩌면 타이머 인스턴스를 저장하는 방법에 대한 약간의 코드를 보여줄 수 있습니다. –
이 스레드를보고 도움이되는지 알려주세요. https://stackoverflow.com/questions/12715139/python-wsgi-multiprocessing-and-shared-data –