TL; DR : 물리학 실험을 제어하고 읽는 Python 코드를 지속적으로 실행하고 있습니다. 이제 HTTP API를 추가하려고합니다.파이썬 프로세스를 지속적으로 실행하기위한 HTTP API 구현하기
USB를 사용하여 하드웨어를 제어하는 모듈을 작성했습니다. 자율적으로 작동하는 여러 유형의 스크립트를 작성할 수 있지만 인터넷을 통해 실행중인 실험을 제어하고 싶습니다. 저는 HTTP API에 대한 아이디어를 좋아하고 Flask의 개발 서버를 사용하여 개념 증명을 구현했습니다.
이 실험은 USB 연결을 요구하는 단일 프로세스로 실행되며 주기적으로 (16ms마다) 모든 데이터를 읽습니다. 이 프로세스는 하드웨어 설정 및 명령을 쓰고 데이터 및 명령 응답을 읽습니다.
이 프로세스와 통신하는 데 올바른 방법을 선택하는 데 몇 가지 문제가 있습니다. HTTP 서버에 단일 작업자 만있는 경우 작동합니다. 그런 다음 파이썬의 다중 처리 기능을 사용할 수 있습니다. 통신용 파이프. 더 많은 또는 적은 저수준 소켓 (또는 zeromq 같은 것들)을 사용하여 요청/응답조차도 작동해야하지만 프로토콜의 일종을 구현해야합니다 : send { 'cmd': 'set_voltage', 'value': 900 } 대신 hardware.set_voltage (800) (독립 실행 형 스크립트에서 사용할 수 있음)를 호출합니다. 나는 일종의 RPC를 사용할 수 있지만, 모든 사람들 (SimpleXMLRPCServer, Pyro)은 '서버'(이 경우에는 실험을 실행하는 프로세스)에서 일종의 이벤트 루프를 사용하여 요청을 처리합니다. 하지만 들어오는 요청을 기다리는 이벤트 루프를 가질 수는 없습니다. 그것은 내 하드웨어를 읽고 있어야합니다! 나는 꽤 많이 봤는데,하지만 내 질문을 바꿔 보려고, 결국 셀레 리 대답으로, 결국 하나의 직업을 연기 해지지만 결국 장기 실행 프로세스와 의사 소통에 대해하지 않습니다.
나는 혼란 스럽다. 나는이 일을 할 수 있지만, 나는 몇 바퀴를 재발견 할까봐 걱정한다. 터미널에서 내 앱을 시작하고 어디에서든지 웹 브라우저를 열고 내 실험을 모니터링하고 제어하려고합니다.
업데이트 :
from pysparc.muonlab.muonlab_ii import MuonlabII
muonlab = MuonlabII()
muonlab.select_lifetime_measurement()
muonlab.set_pmt1_voltage(900)
muonlab.set_pmt1_threshold(500)
lifetimes = []
while True:
data = muonlab.read_lifetime_data()
if data:
print "Muon decays detected with lifetimes", data
lifetimes.extend(data)
모듈은 https://github.com/HiSPARC/pysparc/tree/master/pysparc/muonlab에 살고 : 다음 코드는 모듈을 사용하는 기본적인 예입니다. HTTP API의 현재 구현은 https://github.com/HiSPARC/pysparc/blob/master/bin/muonlab_with_http_api입니다.
많은 테스트를 거친 모듈에 꽤 만족하지만 HTTP API는 Flask의 단일 스레드 개발 서버 (설명서와 인터넷에서 나에게 나쁜 생각이라고 말함)를 사용하여 실행하고 파이프를 통해 사전을 전달합니다 IPC의 일종. 나는 위의 스크립트에서 이런 일을 할 수있을 싶어요 :
while True:
data = muonlab.read_lifetime_data()
if data:
print "Muon decays detected with lifetimes", data
lifetimes.extend(data)
process_remote_requests()
어디 process_remote_requests
는 muonlab
인스턴스를 호출하거나 데이터를 반환하는 매우 간단한 기능입니다. 내가 SQLite는 또는 동시 액세스를 처리하는 다른 무언가에 그것을 저장할 수 있기 때문에, 문제의 아마 덜
muonlab = RemoteMuonlab()
@app.route('/pmt1_voltage', methods=['GET', 'PUT'])
def get_data():
if request.method == 'PUT':
voltage = request.form['voltage']
muonlab.set_pmt1_voltage(voltage)
else:
voltage = muonlab.get_pmt1_voltage()
return jsonify(voltage=voltage)
응용 프로그램에서 측정 데이터를 얻기입니다 : 그럼, 내 플라스크보기에, 내가 좋아하는 뭔가를 것입니다.
사용중인 코드를 표시해야합니다. 최소 코드 샘플을 게시하는 것은 SO에 대한 요구 사항입니다. – jeremyjjbrown
아동 실험 과정을 중단시키는 제어 프로세스가 필요한 이유가 있습니까? 자식은 새로운 업데이트를 부모에게 다시 보낼 수 있습니다. 이 시점에서 웹 서버가 소켓이나 XMLRPC를 통해 부모와 대화하고 잠시 동안 업데이트를 받도록하십시오 – Matt
@matt이 경우 부모에게는 XMLRPC 요청을 처리 할뿐만 아니라 업데이트를받는 이벤트 루프가 있어야합니다 , 권리? –