python第二十二次課 2018 05 22

2021-08-20 05:00:22 字數 4954 閱讀 4254

python執行緒

threading多執行緒

threading用於提供執行緒相關的操作,執行緒是應用程式中工作的最小單元。python當前版本的多執行緒庫沒有實現優先順序、執行緒組,執行緒也不能被停止、暫停、恢復、中斷。

threading模組提供的類:  

thread, lock, rlock, condition, [bounded]semaphore, event, timer, local。

threading 模組提供的常用方法: 

threading.currentthread(): 返回當前的執行緒變數。 

threading.enumerate(): 返回乙個包含正在執行的執行緒的list。正在執行指執行緒啟動後、結束前,不包括啟動前和終止後的執行緒。 

threading.activecount(): 返回正在執行的執行緒數量,與len(threading.enumerate())有相同的結果。

threading 模組提供的常量:

threading.timeout_max 設定threading全域性超時時間。

構造方法: 

thread(group=none, target=none, name=none, args=(), kwargs={}) 

group: 執行緒組,目前還沒有實現,庫引用中提示必須是none; 

target: 要執行的方法; 

name: 執行緒名; 

args/kwargs: 要傳入方法的引數。

例項方法: 

isalive(): 返回執行緒是否在執行。正在執行指啟動後、終止前。 

get/setname(name): 獲取/設定執行緒名。 

start():  執行緒準備就緒,等待cpu排程

is/setdaemon(bool): 獲取/設定是後台執行緒(預設前台執行緒(false))。(在start之前設定)

如果是後台執行緒,主線程執行過程中,後台執行緒也在進行,主線程執行完畢後,後台執行緒不論成功與否,主線程和後台執行緒均停止

如果是前台執行緒,主線程執行過程中,前台執行緒也在進行,主線程執行完畢後,等待前台執行緒也執行完成後,程式停止

start(): 啟動執行緒。 

join([timeout]): 阻塞當前上下文環境的執行緒,直到呼叫此方法的執行緒終止或到達指定的timeout(可選引數)。

lock、rlock類

由於執行緒之間隨機排程:某執行緒可能在執行n條後,cpu接著執行其他執行緒。為了多個執行緒同時操作乙個記憶體中的資源時不產生混亂,我們使用鎖。

lock(指令鎖)是可用的最低階的同步指令。lock處於鎖定狀態時,不被特定的執行緒擁有。lock包含兩種狀態——鎖定和非鎖定,以及兩個基本的方法。

可以認為lock有乙個鎖定池,當執行緒請求鎖定時,將執行緒至於池中,直到獲得鎖定後出池。池中的執行緒處於狀態圖中的同步阻塞狀態。

rlock(可重入鎖)是乙個可以被同乙個執行緒請求多次的同步指令。rlock使用了「擁有的執行緒」和「遞迴等級」的概念,處於鎖定狀態時,rlock被某個執行緒擁有。擁有rlock的執行緒可以再次呼叫acquire(),釋放鎖時需要呼叫release()相同次數。

可以認為rlock包含乙個鎖定池和乙個初始值為0的計數器,每次成功呼叫 acquire()/release(),計數器將+1/-1,為0時鎖處於未鎖定狀態。

簡言之:lock屬於全域性,rlock屬於執行緒。

構造方法: 

lock(),rlock(),推薦使用rlock()

例項方法: 

acquire([timeout]): 嘗試獲得鎖定。使執行緒進入同步阻塞狀態。 

release(): 釋放鎖。使用前線程必須已獲得鎖定,否則將丟擲異常。

強大manage

'''from multiprocessing import manager, process

def worker(dt, lt):

for i in range(10):

dt[i] = i*i

lt += [x for x in range(11, 16)]

if __name__ == '__main__':

manager = manager()

dt = manager.dict()

lt = manager.list()

p = process(target=worker, args=(dt, lt))

p.start()

p.join(timeout=3)

print(dt)

print(lt)

def worker(dt, lt):

for i in range(10):

key = "args" + str(i)

dt[key] = i*i

print(dt)

lt += [x for x in range(10)]

print(lt)

worker(dict(), list())

import time

import multiprocessing

def fun(msg):

print("#########start#### ".format(msg))

time.sleep(3)

print("#########end###### ".format(msg))

if __name__ == '__main__':

print("start main")

pool = multiprocessing.pool(processes=3)

for i in range(1, 7):

msg = "hello ".format(i)

pool.close()#在呼叫join之前,要先呼叫close,否則會報錯,close執行完不會有新的程序加入到pool

pool.join()#join 是等待所有的子程序結束

print("end main")

'''多執行緒    密集型io

多執行緒的實現有兩種方法:

方法1:

和多程序類似

方法2:

通過繼承的方式

'''import threading

def worker(args):

print("開始子程序 ".format(args))

print("結束子程序 ".format(args))

if __name__ == '__main__':

print("start main")

t1 = threading.thread(target=worker, args=(1,))

t2 = threading.thread(target=worker, args=(2,))

t1.start()

t2.start()

print("end main")

'''多執行緒    密集型io

多執行緒的實現有兩種方法:

方法1:

和多程序類似

方法2:

通過繼承的方式

'''import threading

import time

class hello(threading.thread):

def __init__(self, args):

super(hello, self).__init__()

self.args = args

global a

print("a = ".format(a))

a += 1

def run(self):

print("開始子程序 ".format(self.args))

print("結束子程序 ".format(self.args))

if __name__ == '__main__':

a = 1

print("start main")

t1 = hello(5)

time.sleep(3)

t2 = hello(5)

t1.start()

t2.start()

print("#####a = ####".format(a))

print("end main")

import threading

lock = threading.lock()

lock.acquire()#獲取鎖

lock.release()#釋放鎖

# with lock:

#     time.sleep(3)

# with open("1.txt", "w") as f:

#     f.close

'''pip install threadpool

from threadpool import *

pool = threadpool(size)

requests = makerequests()

'''import threadpool

def hello(m, n, o):

print("m =   n=  o=".format(m, n, o))

if __name__ == '__main__':

# 方法1

lst_vars_1 = ['1', '2', '3']

lst_vars_2 = ['4', '5', '6']

func_var = [(lst_vars_1, none), (lst_vars_2, none)]

# 方法2

# dict_vars_1 =

# dict_vars_2 =

# func_var = [(none, dict_vars_1), (none, dict_vars_2)]

pool = threadpool.threadpool(2)

requests = threadpool.makerequests(hello, func_var)

[pool.putrequest(req) for req in requests]

pool.wait()

第二十二次 查詢 三

雜湊表 hash 的查詢技術 雜湊函式的構造 直接定址法 除留餘數法 數字分析法 平方取中法 摺疊法 分段疊加法 衝突處理方法 開放定址法 鏈位址法 建立公共溢位區 雜湊函式的構造 直接定址法 除留餘數法 數字分析法 平方取中法 摺疊法 分段疊加法 衝突處理方法 開放定址法 鏈位址法 建立公共溢位區...

第二十二題

第二十二題 韓信點兵 在中國數學史上,廣泛流傳著乙個 韓信點兵 的故事 韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點名的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數 按從1到5報數,記下最末乙個士兵報的數為1 按從1...

第二十二天

區域性變數和全域性變數 在乙個函式內部定義的變數是內部變數,他只有在本函式範圍內才有效,在此函式之外是不能使用這些變數的,這稱為區域性變數。復合語句的的變數是可以用 全域性變數也叫外部變數 全域性變數從 定義從 開始用 變數的儲存類別 從空間上講剛剛的就是作用域 從空間 還可以從變數值存在的時間 生...