使用pandas與queue實現(xiàn)locust腳本參數(shù)化

Locust作為開源的壓力測試工具,這幾年備受關(guān)注,用法已經(jīng)被大神們開發(fā)的差不多了太惠。最近版本大更新,我重新學(xué)習(xí)一些基礎(chǔ)用法疲憋,卻發(fā)現(xiàn)參數(shù)化這一塊的代碼不能滿足我的需求凿渊。所以這次我從一個小白的角度出發(fā),爭取用簡單的方式缚柳,實現(xiàn)Locust獲取外部csv數(shù)據(jù)并參數(shù)化埃脏。

在直接編寫代碼之前,要了解兩個庫:pandas與queue秋忙。(想直接看代碼麻煩手動跳到最后剂癌。)

pandas——Python的數(shù)據(jù)分析支持庫

Python Data Analysis Library 或 pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的翰绊。Pandas 納入了大量庫和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型佩谷,提供了高效地操作大型數(shù)據(jù)集所需的工具。

簡言之监嗜,pandas高效谐檀,方便,好用裁奇。

它有兩種獨有的數(shù)據(jù)結(jié)構(gòu):Series 和 DataFrame桐猬。

  • Series:與Python基本的數(shù)據(jù)結(jié)構(gòu)List相近,Series中只允許存儲相同的數(shù)據(jù)類型
  • DataFrame:二維的表格型數(shù)據(jù)結(jié)構(gòu)刽肠。很多功能與R中的data.frame類似溃肪。可以將DataFrame理解為Series的容器音五。

在獲取csv數(shù)據(jù)時惫撰,我使用了DataFrame數(shù)據(jù)結(jié)構(gòu),這種表格形式更方便理解與操作躺涝,下面是基本用法:

  from pandas import Series,DataFrame

 # 使用dict定義DataFrame
 data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}

 # 讀取csv文件
 reader = pandas.read_csv(file_path)

 # 將數(shù)據(jù)轉(zhuǎn)換為DataFrame格式
 df = pd.DataFrame(reader)

 # 遍歷行數(shù)據(jù)
 for index, row in dFrame.iterrows():
            print(index, row[i])   i為列序號厨钻,從0開始

queue——一種同步的隊列類

隊列queue 多應(yīng)用在多線程應(yīng)用中,多線程訪問共享變量坚嗜。對于多線程而言夯膀,訪問共享變量時,隊列queue是線程安全的苍蔬。從queue隊列的具體實現(xiàn)中诱建,可以看出queue使用了1個線程互斥鎖(pthread.Lock()),以及3個條件標(biāo)量(pthread.condition()),來保證了線程安全碟绑“吃常【線程安全:一個函數(shù)茎匠,當(dāng)且僅當(dāng)被多個并發(fā)線程反復(fù)調(diào)用時,能夠一直產(chǎn)生正確的結(jié)果辜荠,才能夠被稱為線程安全的(thread-safe)】

我主要使用queue.Queue來實例化參數(shù)隊列,將數(shù)據(jù)put到對列中抓狭,再從隊列中g(shù)et出來伯病,傳給相應(yīng)請求。下面為基本用法:

  import queue

  # 實例化一個隊列
  queue_data = queue.Queue()  
  # put數(shù)據(jù)
  queue_data.put_nowait(user)
  # get數(shù)據(jù)
  queue_data.get_nowait(user)

put_nowait()與get_nowait()實際為block=False的put()與get()否过,消息隊列如果沒有空間可寫入/獲取午笛,則會立刻拋出“queue.Full/queue.Empty”異常

pandas與queue結(jié)合,實現(xiàn)參數(shù)化

  import queue
  import pandas as pd
  import sys
  from locust import task, HttpUser, between, TaskSet

  # 預(yù)防棧溢出苗桂,設(shè)置嵌套層數(shù)上限為10000
  sys.setrecursionlimit(10000)

  # 測試數(shù)據(jù)csv文件路徑
  file_path = "test_data.csv"

  # 讀取csv文件
  reader = pd.read_csv(file_path)
  # 將數(shù)據(jù)轉(zhuǎn)換為DataFrame格式
  df = pd.DataFrame(reader)


  # 定義csv文件的單列數(shù)據(jù)獲取函數(shù)
  def queue_data(dFrame, i, **kwargs):
      data = queue.Queue()  # 先進(jìn)先出
      # queue_data = queue.LifoQueue() 后進(jìn)先出
      for index, row in dFrame.iterrows():
          # print(index, row[i])   i為列序號药磺,從0開始
          try:
              data.put_nowait(row[i])
          except queue.Full:
              print("隊列溢出")
      return data

  class MyTaskSet(TaskSet):
      # 在task中使用queue數(shù)據(jù)
      @task
      def task1(self):
          # 使用queue中的數(shù)據(jù)進(jìn)行參數(shù)化
          url = "/postData"
          try:
              row0_data = self.user.row0.get_nowait()
              row1_data = self.user.row1.get_nowait()
              payload = {"row0": row0_data, "row1": row1_data}
              print(payload)
              res = self.client.post(url, json=payload, name="使用queue中的數(shù)據(jù)進(jìn)行參數(shù)化")
          except queue.Empty:
              # 隊列取空后退出
              print("queue is empty")
              exit()


  class MyUser(HttpUser):
      host = "http://example.com"
      tasks = [MyTaskSet]
      wait_time = between(1, 3)
      # 獲取單列數(shù)據(jù)放入對應(yīng)隊列中
      row0 = queue_data(df, 0)
      row1 = queue_data(df, 1)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市煤伟,隨后出現(xiàn)的幾起案子癌佩,更是在濱河造成了極大的恐慌,老刑警劉巖便锨,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件围辙,死亡現(xiàn)場離奇詭異,居然都是意外死亡放案,警方通過查閱死者的電腦和手機姚建,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吱殉,“玉大人掸冤,你說我怎么就攤上這事∮仰ǎ” “怎么了稿湿?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長押赊。 經(jīng)常有香客問我缎罢,道長,這世上最難降的妖魔是什么考杉? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任策精,我火速辦了婚禮,結(jié)果婚禮上崇棠,老公的妹妹穿的比我還像新娘咽袜。我一直安慰自己,他們只是感情好枕稀,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布询刹。 她就那樣靜靜地躺著谜嫉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凹联。 梳的紋絲不亂的頭發(fā)上沐兰,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音蔽挠,去河邊找鬼住闯。 笑死,一個胖子當(dāng)著我的面吹牛澳淑,可吹牛的內(nèi)容都是我干的比原。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼杠巡,長吁一口氣:“原來是場噩夢啊……” “哼量窘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氢拥,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚌铜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嫩海,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厘线,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年出革,在試婚紗的時候發(fā)現(xiàn)自己被綠了造壮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡骂束,死狀恐怖耳璧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情展箱,我是刑警寧澤旨枯,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站混驰,受9級特大地震影響攀隔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栖榨,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一昆汹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婴栽,春花似錦满粗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挤聘。三九已至,卻和暖如春捅彻,著一層夾襖步出監(jiān)牢的瞬間组去,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工步淹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留从隆,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓贤旷,卻偏偏與公主長得像广料,于是被迫代替她去往敵國和親砾脑。 傳聞我的和親對象是個殘疾皇子幼驶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359