程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【python多線程】 多線程池ThreadPoolExecutor及讀寫鎖readerwriterlock的使用

編輯:Python

多線程池用法:

import time
import threading
from concurrent.futures import ThreadPoolExecutor,as_completed
def myCallBack(arg):
print(arg)
return arg
if __name__ == "__main__":
with ThreadPoolExecutor(max_workers=5) as executor:
list = [1,2,3]
ans = [executor.submit(myCallBack, i) for i in list]
for res in as_completed(ans):
print("給出結果",res.result())

輸出結果:

1
2
3
給出結果 1
給出結果 2
給出結果 3
thread join success!

多線程加普通鎖:

import time
import threading
from concurrent.futures import ThreadPoolExecutor,as_completed
def get():
for i in range(3):
time.sleep(1)
print(i)
def task(lock):
lock.acquire() #獲取鎖
get()
lock.release() #釋放鎖
if __name__ == "__main__":
lock=threading.RLock()
with ThreadPoolExecutor(max_workers=5) as executor:
for i in range(5):
ans = [executor.submit(task, lock)]

輸出結果:

0
1
2
0
1
2
0
1
2
0
1
2
0
1
2

關於讀寫鎖:

在某些情況下,與常規鎖相比,讀寫鎖可以提高程序的性能,但實現起來更復雜,並且通常使用更多資源來跟蹤讀者的數量。

決定使用哪種類型的互斥鎖,一般的經驗法則是:當線程從共享數據中讀取遠多於寫入時,使用讀寫器鎖,例如某些類型的數據庫應用程序。

如果程序的大多數線程都在寫,不建議使用讀寫鎖。
讀寫鎖安裝方式:
pip install -i https://pypi.douban.com/simple readerwriterlock

我們使用from readerwriterlock import rwlock命令導入讀寫鎖,這裡使用的是Fair版本,意味著讀和寫享有相同的優先級。讀寫鎖定有兩種方法gen_rlock()和gen_wlock()分別生成讀鎖和寫鎖,其中讀鎖可以由多個線程同時擁有,而寫鎖只能由一個線程掌握。

我們使用rwlock.RWLockFair().gen_rlock().c_rw_lock.v_read_count統計出持有讀取鎖的線程數.
使用rwlock.RWLockFair().gen_wlock()…v_locked是否為True判斷是否寫鎖激活
多線程加讀寫鎖代碼:

import os
import sys
import time
import threading
from concurrent.futures import ThreadPoolExecutor,as_completed
from readerwriterlock import rwlock
lock = rwlock.RWLockFair()
rlock = lock.gen_rlock()
wlock = lock.gen_wlock()
#使用此行代碼顯示當前正在執行的讀任務數rlock.c_rw_lock.v_read_count
writeState=True
def write(lock):
if True:
wlock.acquire()
print("進行寫操作")
time.sleep(1)
wlock.release()
else:
print("當前已有讀任務正在進行")
def read(lock):
#檢測寫鎖是否上鎖
if wlock.v_locked==False:
rlock.acquire()
print("進行讀操作")
#time.sleep(1)
rlock.release() # 釋放鎖
else:
print("當前已有寫任務正在進行")
if __name__ == "__main__":
lock = rwlock.RWLockFair()
with ThreadPoolExecutor(max_workers=10) as executor:
for i in range(1):
ans = [executor.submit(write, (lock))]
for i in range(5):
ans = [executor.submit(read, (lock))]
time.sleep(2)

輸出結果:

進行寫操作
當前已有寫任務正在進行
進行讀操作
進行讀操作
進行讀操作
進行讀操作

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved