更簡單的執行緒池:
多執行緒和多程序都可以很容易的實現併發,協程通過切換上下文來充分利用cpu實現併發效果
threading模組
thread類的基本狀態和行為
屬性名和值:
name=none,group=none,target=none,args=(),kwargs={},daemon=none
方法:start(),join(),run(), join()
使主線程等待使用join()方法的子程序結束,否則阻塞自己 ,
thread中的子程序預設daemon就是none,這意味著子程序不結束,主程序也不結束,說明主程序是個好大哥,
而thread模組開啟的子程序就沒這個命,主程序結束,子程序跟著完蛋。
join()方法:
效果 :使主線程等待使用join()方法的子執行緒結束,否則阻塞自己 ,
使用場景:主線程需要接受子執行緒的計算結果時使用
守護執行緒是指不重要的程序,如果thread例項化子程序的時候將其設定成守護程序,主線程結束時,將結束子執行緒。
子程序的建立與執行,分為三種方式,
-例項化thread,target=自定義函式
-例項化thread,target=自定義類,start()這個例項時,自動呼叫自定義類的__call__()方法,所以,自定義類必須要自定義__call__()方法。
-自定義建立乙個thread的派生子類,然後自定義其run()方法,然後例項化這個類,然後呼叫其start()方法,
-需要注意,例項化子程序使用一次,不能再次呼叫start()方法
主要使用第一種方法,和第三種方法
給出第三種方法的例子
import大哥已經完事,等小弟們time, threading
import
threading,time
class
mythread(threading.thread):
def__init__
(self,args):
threading.thread.
__init__
(self)
self.args=args
defdo_1(self):
print('
我是do_1 我是做好事')
defdo_2(self):
print('
我是do_2 我是做傻事')
defdo_3(self):
print('
我是do_3 我是做壞事
')
defrun(self):
time.sleep(1)
if self.args % 3==0:
self.do_1()
if self.args % 3==1:
self.do_2()
if self.args % 3==2:
self.do_3()
if__name__ == '
__main__
':
for i in range(20):
t =mythread(i)
t.start()
print('
大哥已經完事,等小弟們
')
執行結果:
我是do_2 我是做傻事
我是do_1 我是做好事
我是do_3 我是做壞事
我是do_1 我是做好事
我是do_2 我是做傻事
我是do_3 我是做壞事
我是do_1 我是做好事
我是do_1 我是做好事
我是do_2 我是做傻事
我是do_2 我是做傻事
我是do_3 我是做壞事
我是do_1 我是做好事
我是do_3 我是做壞事
我是do_2 我是做傻事
我是do_3 我是做壞事
我是do_2 我是做傻事
我是do_1 我是做好事
我是do_2 我是做傻事
我是do_3 我是做壞事
我是do_1 我是做好事
類方法:active_count():存活的執行緒數量,可以用來控制同時存活併發執行緒數目。經過測試,win10,i7四核執行緒可以同時發起幾千個執行緒,當然這沒有必要。
current_thread():返回當前環境的thread物件,資料型別int
enumerate():返回活動的thread物件列表,資料型別list
[<_mainthread started>, , , , , , , , , , , , , , , , , , , , ]setprofile(func):為所有程序設定乙個trace函式
setprofile(func):為所有執行緒設定乙個profile函式
stack_size(size=0):返回新建立執行緒的棧大小,設定之後建立執行緒的棧大小
鎖和訊號量,控制資料訪問
訊號量用來控制併發子執行緒的數量,使其不至於訪問過快,
訊號量是乙個計數器 設定它的最大值,最小值不設定,為0,
bignumber=boundedsemaphore(5) 代表最大數字是5,每一次bignumber.acquire()使數字減一,
bigunmber.release()使數字加一 當數字小於0,或者大於5時阻塞。
acquire()和release方法引數: acquire(self, blocking=true, timeout=none):
register函式
-對主程序執行時間的控制,
- 在子程序非同步執行同時,主程式後續執行依賴子程式的返回結果
join(),atexit模組register。
實現較為精細的控制:join方法通過註冊每乙個子執行緒,立即阻塞主線程
粗暴的控制:
from atexit import register#在當前函式租冊乙個退出函式,當前函式退出的時候執行
@register
def _atexit():
#.... 寫入檔案,輸出最終結果
#注意:可以在任意一層函式設定
多執行緒併發
多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...
(多執行緒)多執行緒的併發安全
多執行緒併發操作同乙個資源 同步鎖 多執行緒操作的鎖必須唯一 必須搞清楚 哪些 需要同步?那些在操作共享資源的 只要包含非讀的操作,或者根據共享資源進行條件判斷的,就需要同步!同步 塊解決 package com.gc.thread 多執行緒操作共享資源 併發 執行緒安全問題 同步 鎖 相對而言效能...
多執行緒 Java多執行緒與併發
實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...