




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第python使用多線程備份數(shù)據(jù)庫的步驟目錄一、為什么要用線程池二、線程池練習
演示例子1:使用submit方法演示例子2:使用map方法三、線上數(shù)據(jù)庫測試總結:
一、為什么要用線程池
1.多線程比單線程運行要快很多,比如在我工作中,每臺服務器至少8個庫以上,用單線程備份太慢了。
2.不是越多線程就會越好,而是根據(jù)服務器的資源來合理定義worker線程,否則會造成服務器嚴重負載,影響到線上業(yè)務。
3.備份數(shù)據(jù)庫都是消耗IO操作,用多線程比多進程稍微會更有優(yōu)勢。
從Python3.2開始,標準庫為我們提供了concurrent.futures模塊,它提供了ThreadPoolExecutor(線程池)和ProcessPoolExecutor(進程池)兩個類。
相比threading等模塊,該模塊通過submit返回的是一個future對象,它是一個未來可期的對象,通過它可以獲悉線程的狀態(tài)主線程(或進程)中可以獲取某一個線程(進程)執(zhí)行的狀態(tài)或者某一個任務執(zhí)行的狀態(tài)及返回值:
主線程可以獲取某一個線程(或者任務的)的狀態(tài),以及返回值。
當一個線程完成的時候,主線程能夠立即知道。
讓多線程和多進程的編碼接口一致。
二、線程池練習
演示例子1:使用submit方法
fromconcurrent.futuresimportThreadPoolExecutor
importtime
deftest_thread(sec):
time.sleep(sec)
print(f"sleep{sec}done")
returnsec
withThreadPoolExecutor(max_workers=4)ast:#創(chuàng)建一個最大容納數(shù)量為4的線程池
task1=t.submit(test_thread,1)
task2=t.submit(test_thread,2)#通過submit提交執(zhí)行的函數(shù)到線程池中
task3=t.submit(test_thread,3)
print(f"task1:{task1.done()}")#通過done來判斷線程是否完成
print(f"task2:{task2.done()}")
print(f"task3:{task3.done()}")
time.sleep(2.5)
print(f"task1:{task1.done()}")
print(f"task2:{task2.done()}")
print(f"task3:{task3.done()}")
print(task1.result())#通過result來獲取返回值
結果輸出:
task1:False
task2:False
task3:False
sleep1done
sleep2done
task1:True
task2:True
task3:False
sleep3done
使用with語句,通過ThreadPoolExecutor構造實例,同時傳入max_workers參數(shù)來設置線程池中最多能同時運行的線程數(shù)目。
使用submit函數(shù)來提交線程需要執(zhí)行的任務到線程池中,并返回該任務的句柄(類似于文件、畫圖),注意submit()不是阻塞的,而是立即返回。
通過使用done()方法判斷該任務是否結束。上面的例子可以看出,提交任務后立即判斷任務狀態(tài),顯示3個任務都未完成。在延時2.5后,task1和task2執(zhí)行完畢,task3仍在執(zhí)行中。
演示例子2:使用map方法
importtime
fromconcurrent.futuresimportThreadPoolExecutor
defspider(page):
time.sleep(page)
returnpage
start=time.time()
executor=ThreadPoolExecutor(max_workers=4)
i=1
forresultinexecutor.map(spider,[2,3,1,4]):
print("task{}:{}".format(i,result))
i+=1
結果輸出:
task1:2
task2:3
task3:1
task4:4
fromconcurrent.futuresimportThreadPoolExecutor有兩種方式,一種是submit()函數(shù),另一種是map()函數(shù),兩者的主要區(qū)別在于:
1.map可以保證輸出的順序,submit輸出的順序是亂的
2.如果你要提交的任務的函數(shù)是一樣的,就可以簡化成map。但是假如提交的任務函數(shù)是不一樣的,或者執(zhí)行的過程之可能出現(xiàn)異常(使用map執(zhí)行過程中發(fā)現(xiàn)問題會直接拋出錯誤)就要用到submit()
3.submit和map的參數(shù)是不同的,submit每次都需要提交一個目標函數(shù)和對應的參數(shù),map只需要提交一次目標函數(shù),目標函數(shù)的參數(shù)放在一個迭代器(列表,字典)里就可以。
三、線上數(shù)據(jù)庫測試
環(huán)境:centos6,數(shù)據(jù)庫版本5.7,數(shù)據(jù)備份2個1.7G、一個800M、一個200M
第一種:shell腳本for的方式備份4個數(shù)據(jù)庫
#!/bin/bash
backup_path="/data/backup/"
myuser="root"
mypwd="123456"
db_name="test_1000"
current_time=$(date+%Y%m%d%H%M%S)
foriin$(seq4);do
/usr/local/mysql/bin/mysqldump-u${myuser}-p${mypwd}--single-transaction--master-data=2--set-gtid-purged=off"${db_name}${i}"|gzip${backup_path}/"${db_name}${i}"_${current_t
ime}.sql.gz
done
查看執(zhí)行時間
mysqldump:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
mysqldump:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
mysqldump:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
mysqldump:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
real4m28.421s
user3m50.360s
sys0m5.962s
第二種方式:多線程備份
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外籍人員用餐管理辦法
- 維修質量風險管理辦法
- 電廠燃料采購管理辦法
- 后勤職工培訓課件
- 肝膿腫護理課件下載
- 肝臟生理功能課件中醫(yī)
- 福州八上期中數(shù)學試卷
- 肝病用藥護理課件
- 肝病心理護理課件下載
- 高中學考往年數(shù)學試卷
- 太極拳理論考試復習題
- 《水利水電工程白蟻實時自動化監(jiān)測預警系統(tǒng)技術規(guī)范》
- 2024年湖北省中考英語試卷
- GB/T 15316-2024節(jié)能監(jiān)測技術通則
- 科創(chuàng)板股票開戶知識測評題庫及答案
- 幼兒園食堂舉一反三自查報告
- 光伏分布式項目日報模板
- 蘇科版九年級物理上冊一課一測-11.1杠桿
- 中試平臺管理制度
- 診斷學題庫(附答案)
- 重要概念一胎產式胎兒身體縱軸與母體縱軸之間的關系
評論
0/150
提交評論