python使用多線程備份數(shù)據庫的步驟_第1頁
python使用多線程備份數(shù)據庫的步驟_第2頁
python使用多線程備份數(shù)據庫的步驟_第3頁
python使用多線程備份數(shù)據庫的步驟_第4頁
python使用多線程備份數(shù)據庫的步驟_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第python使用多線程備份數(shù)據庫的步驟目錄一、為什么要用線程池二、線程池練習

演示例子1:使用submit方法演示例子2:使用map方法三、線上數(shù)據庫測試總結:

一、為什么要用線程池

1.多線程比單線程運行要快很多,比如在我工作中,每臺服務器至少8個庫以上,用單線程備份太慢了。

2.不是越多線程就會越好,而是根據服務器的資源來合理定義worker線程,否則會造成服務器嚴重負載,影響到線上業(yè)務。

3.備份數(shù)據庫都是消耗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ù)據庫測試

環(huán)境:centos6,數(shù)據庫版本5.7,數(shù)據備份2個1.7G、一個800M、一個200M

第一種:shell腳本for的方式備份4個數(shù)據庫

#!/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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論