0
from sanic import Sanic
from sanic import response
app = Sanic(__name__)
@app.route('/v1/ok', methods=['GET'])
async def post_handler(request):
return response.text("hey all good")
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8001, debug=True)
내가 여기개발 REST API를
sanic 내 결론이다 사용하여 파이썬에서 REST API를 작성하는 것을 시도하고있다 :이 실행 wrk 50 스레드를 사용하여 API를 GET 벤치마킹을 시도
30s 테스트. 4기가바이트 RAM이 기계 사용 AWS EC2의 t2.medium 2 CPU 명령은
을 사용wrk -t50 -c4000 -d30s http://XXX.XX.XXX.XXX:8001/v1/ok
벤치마킹 결과
Running 30s test @ http://XXX.XX.XXX.XXX:8001/v1/ok
50 threads and 4000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 559.30ms 117.86ms 1.99s 94.47%
Req/Sec 41.92 44.33 361.00 86.14%
53260 requests in 30.10s, 6.70MB read
Socket errors: connect 1493, read 15631, write 0, timeout 4
Requests/sec: 1769.21
Transfer/sec: 228.06KB
내 의심의 여지가 어떻게
에 향상시킬 수 있다는 것입니다- 요청 시간이 초과되었습니다. 현재 4입니다. 0이어야합니다. 나는 keras 모델을로드하고 예측을하려고하고있어서, POST 요청의 경우
(너무)입니다
코드가 작성된 방식에 문제가 있습니까?
또는
이 Sanic의 한계인가?
다른 REST 프레임 워크를 사용해 야하나요?
추신 : 플라스크에 대한 나의 경험은 대기 시간 및 시간이 초과 된 요청의 측면에서 훨씬 더 나쁩니다.
import sys
import os
import json
import pandas
import numpy
import optparse
from keras.models import Sequential, load_model
from keras.preprocessing import sequence
from keras.preprocessing.text import Tokenizer
from collections import OrderedDict
from sanic import Sanic
from sanic import response
import time
app = Sanic(__name__)
@app.route('/v1/mal/prediction', methods=['POST'])
async def post_handler(request):
csv_file = 'alerts.csv'
log_entry = request.json
dataframe = pandas.read_csv(csv_file, engine='python', quotechar='|', header=None)
dataset = dataframe.values
X = dataset[:,0]
for index, item in enumerate(X):
reqJson = json.loads(item, object_pairs_hook=OrderedDict)
del reqJson['timestamp']
del reqJson['headers']
del reqJson['source']
del reqJson['route']
del reqJson['responsePayload']
X[index] = json.dumps(reqJson, separators=(',', ':'))
tokenizer = Tokenizer(filters='\t\n', char_level=True)
tokenizer.fit_on_texts(X)
seq = tokenizer.texts_to_sequences([log_entry])
max_log_length = 1024
log_entry_processed = sequence.pad_sequences(seq, maxlen=max_log_length)
model = load_model('model.h5')
model.load_weights('weights.h5')
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
prediction = model.predict(log_entry_processed)
return response.text(prediction[0])
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000, debug=True)
더 나은 방법으로 API 응답 시간을 개선하고 시간 초과 요청을 줄일 것을 제안 하시겠습니까?
덕분에 성능이 여기에 벤치 마크 테스트의 비교입니다, 조금 향상 듯 'https : // jpst.it/166oe'하지만 대기 시간과 no를 개선하기 위해 여전히 많은 일들을 할 수 있다고 생각합니다. 초당 요청 수 귀하의 의견에 더 많은 도움이 될 것입니다. – x0v