2017-09-03 4 views
0

외부 전자 장치를 제어/측정하기 위해 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() 
+0

당신이 mod_wsgi에 데몬 모드를 사용하고 처리? 만약 그렇다면, 모든 요청이 하나의 프로세스에서 처리되는 것이 기본입니다. Apache/mod_wsgi를 임베디드 모드로 사용하고있는 것처럼 들리 겠지만, 아파치가 프로세스/스레드의 수를 지정하여 요청이 다른 프로세스에서 처리 될 수 있습니다. mod_wsgi 구성을 표시하십시오. –

+0

각 스레드가 자체 타이머 인스턴스를 갖도록 스레드 로컬 데이터를 사용해야하는 경우 일 수도 있습니다. 또는 일종의 요청 ID 또는 세션 ID로 키 구조화 된 데이터 구조를 유지해야합니다. 당신의 설명은 조금도 혼란 스럽기 때문에 어떤 것도 제안하기가 어렵습니다. 어쩌면 타이머 인스턴스를 저장하는 방법에 대한 약간의 코드를 보여줄 수 있습니다. –

+0

이 스레드를보고 도움이되는지 알려주세요. https://stackoverflow.com/questions/12715139/python-wsgi-multiprocessing-and-shared-data –

답변

0

당신은 스레드를 통해

Python, WSGI, multiprocessing and shared data

기본적으로 당신이 공유 할 데이터에 논의 된 접근 방법을 시도해야는/

+0

훌륭하게 작동합니다. 다시 한 번 감사드립니다! – dan