我有一個腳本可以對燒瓶應用程式運行 api 呼叫。我想用狀態碼和請求的經過時間創建一個熊貓資料幀,我可以將其寫入 csv 檔案。我的問題是只有一個條目最終出現在 csv 檔案中,我不知道為什么。標題應該是“statuscode”和“elapsed time”。當我列印 statuscode 和 elapsedtime 變數時,會列印每個回應,而不僅僅是一個
有了這個 csv 檔案,我想創建一個圖表來可視化回應時間
我試圖撰寫“write_df”函式,但最終使用了“send_api_request”函式中請求的變數。
import requests
import datetime
import concurrent.futures
import csv
import pandas as pd
HOST = 'http://127.0.0.1:5000'
API_PATH = '/'
ENDPOINT = HOST API_PATH
MAX_THREADS = 8
CONCURRENT_THREADS = 10
csv_path = "flasktests.csv"
try:
file = open(csv_path, 'w', newline='')
writer = csv.writer(file)
except:
print("error opening or writing to the CSV file!")
def send_api_request():
try:
#print ('Sending API request: ', ENDPOINT)
r = requests.get(ENDPOINT)
if r.status_code == 200:
#print('Received: ', r.status_code, r.elapsed)
responses = {"statuscode":[r.status_code], "elapsed time": [r.elapsed]}
statuscode = r.status_code
elapsedtime = r.elapsed
print(statuscode, elapsedtime)
df = pd.DataFrame([statuscode,elapsedtime], columns=["statuscode","elapsed time"])
df.to_csv(csv_path, index=False)
elif r.status_code == 417:
print('Received error code:', r.status_code, r.json())
except Exception as e:
print("error",str(e))
def write_df(statuscode, elapsedtime):
print(statuscode,elapsedtime)
df = pd.DataFrame({"statuscode":[statuscode], "elapsed time": [elapsedtime]})
df.to_csv(csv_path, index=False)
print(df)
with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:
futures = [executor.submit(send_api_request) for x in range (CONCURRENT_THREADS)]
executor.shutdown(wait=True)
有什么想法我在這里做錯了嗎?謝謝!
uj5u.com熱心網友回復:
df = pd.DataFrame([statuscode,elapsedtime], columns=["statuscode","elapsed, "elapsed time": [elapsedtime]}) df.to_csv(csv_path, index=False)
在這里,您正在撰寫一個只有一個條目的 csv,因為您的資料框df只有一行。并且每次執行此函式時,您都會覆寫現有的 csv。這就是為什么輸出檔案只包含一行(如果算上標題,則為 2,它應該在那里)
我看到您正在嘗試使用多執行緒,這可能不需要。如果您確實想繼續使用它,則需要確保您沒有同時使用兩個執行緒寫入檔案,這會產生很多開銷。相反,我建議你這樣做:
def send_api_request():
try:
#print ('Sending API request: ', ENDPOINT)
r = requests.get(ENDPOINT)
if r.status_code == 200:
#print('Received: ', r.status_code, r.elapsed)
return r.status_code, r.elapsed
elif r.status_code == 417:
print('Received error code:', r.status_code, r.json())
return r.status_code, None
except Exception as e:
print("error",str(e))
# number of times you want to call the API
nb_api_calls = 10
codes = []
elapsed_times = []
for i in range(nb_api_calls):
code, elapsed_time = send_api_request()
if elapsed_time is None:
# An error happened, choose what do do with that information
# Here I am just skipping it
pass
else:
codes.append(code)
elapsed_times.append(elapsed_time)
df = pd.DataFrame({"statuscode": codes,"elapsed time": elapsed_times})
df.to_csv(csv_path, index=False)
請注意,在當前配置下,該"statuscode"列將僅包含值 200 多次
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/515398.html
