多執行緒併發

2022-07-15 23:09:14 字數 3233 閱讀 1762

更簡單的執行緒池:

多執行緒和多程序都可以很容易的實現併發,協程通過切換上下文來充分利用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方法 或者塊 之前必須先獲得該物件鎖的擁有權...