併發安全問題

2022-08-11 04:30:12 字數 2785 閱讀 3258

守護程序是指乙個程序守護另乙個程序

例如a是b的守護程序b如果結束了a也會隨之結束

def

task(name):

print('

%s is running

' %name)

time.sleep(3)

if__name__ == '

__main__':

obj = process(target=task, args=('

egon

',))

obj.daemon=true #守護程序必須在子程序開始前設定

obj.start()

#傳送訊號給作業系統

print('

主')

父程序交給了子程序乙個任務,任務還沒有完成父程序就結束了,子程序就沒有繼續執行的意義了

互斥鎖

互斥鎖是為了保證多程序在呼叫統一資源時不會產生資料錯亂的機制。

解決多程序同時操作乙個資源產生錯亂的方法有兩個

1.加join:

def

task1():

print('

task1:aaa')

time.sleep(random.randint(1,3))

print('

task1:aa1')

time.sleep(random.randint(1, 3))

print('

task1:aa3')

deftask2():

print('

task2:bbb')

time.sleep(random.randint(1, 3))

print('

task2:bb1')

time.sleep(random.randint(1, 3))

print('

task2:bb3')

time.sleep(random.randint(1, 3))

deftask3():

print('

task3:ccc')

time.sleep(random.randint(1, 3))

print('

task:cc1')

time.sleep(random.randint(1, 3))

print('

task3:cc3')

time.sleep(random.randint(1, 3))

if__name__ == '

__main__':

p1=process(target=task1,args=(mutex,))

p2=process(target=task2,args=(mutex,))

p3=process(target=task3,args=(mutex,))

p1.start()

p1.join(2) 在程序開始時加入join等待上乙個程序對資料操作完成後再開始下一程序對資料的操作

p2.start()

p2.join(2)

p3.start()

本質上是吧多程序變成單程序來避免多個程序同時操作乙個資料的情況

mutex=lock()

deftask1(lock):

lock.acquire()

print('

task1:aaa')

time.sleep(random.randint(1,3))

print('

task1:aa1')

time.sleep(random.randint(1, 3))

print('

task1:aa3')

lock.release()

deftask2(lock):

lock.acquire()

print('

task2:bbb')

time.sleep(random.randint(1, 3))

print('

task2:bb1')

time.sleep(random.randint(1, 3))

print('

task2:bb3')

time.sleep(random.randint(1, 3))

lock.release()

deftask3(lock):

lock.acquire()

print('

task3:ccc')

time.sleep(random.randint(1, 3))

print('

task:cc1')

time.sleep(random.randint(1, 3))

print('

task3:cc3')

time.sleep(random.randint(1, 3))

lock.release()      鎖必須有開始和結束,乙個acquire必須對應乙個release

if__name__ == '

__main__':

p1=process(target=task1,args=(mutex,))

p2=process(target=task2,args=(mutex,))

p3=process(target=task3,args=(mutex,))

p1.start()

p2.start()

p3.start()

鎖可以看作乙個執行許可,多個程序同時執行時誰先搶到鎖誰才可以執行,沒搶到鎖的只能等下次

map併發安全問題

go語言官方部落格中 go maps in action 有說明 map型別不是併發安全的 它沒有定義當你同時讀取和寫入map時發生的情況,如果你需要在併發執行的goroutine中讀取和寫入map,那麼訪問時必須通過某種同步機制來調解。讀寫鎖 sync.rwmutex 是用來保護map的一種常用方...

高併發執行緒安全問題

高併發執行緒 1 當多個執行緒訪問同乙個共享物件時,就是高併發執行緒。如,天貓雙十一等。因為執行緒的排程是搶占式的,當乙個執行緒在訪問共享資料 可以是多行 也可以是成員變數 時,其他執行緒也參與了該共享資料的運算,就會造成資料汙染,即執行緒安全 a 可見性 當多條執行緒在運算同一共享資料時,某條執行...

Java併發程式設計 執行緒安全問題

1.執行緒安全的概念 當多個執行緒訪問某乙個類 物件或方法 時,這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的.synchronized 可以在任意物件或方法上加鎖,而加鎖的這段 稱為 互斥區 或 臨界區 示例 package com.thread.safety 執行緒安全...