學習總結 三十三

2022-09-15 19:57:16 字數 4221 閱讀 2353

1)什麼是守護程序

程序是乙個正在執行的程式,守護程序也是乙個程序,守護程序的意思就是乙個程序保護另乙個程序

2)守護程序使用場景

1)什麼是互斥鎖

互斥鎖就是互相排斥的鎖,(乙個資源被鎖了,其他子程序就無法使用)

2)為什麼需要互斥鎖

因為併發帶來的資源競爭問題,當多個程序同時要操作乙個資源將會導致資料錯亂

3)解決資料混亂的方法

1 . 使用join()可以解決資料混亂,但是會把併發任務變成了序列,雖然解決了資料錯亂的問題,但是效率降低了,這樣就沒有開啟子程序了

2. 原本多個程序之間是公平競爭,join執行的順序就定死了,這不合理

3. 給公共資源加鎖,互斥鎖

4)鎖和join的區別

1. join是固定執行順序,會造成父程序等待子程序,鎖依然是公平競爭,誰先搶到誰先執行,父程序可以做其他的事情

2.  最主要的區別:join是把程序全部序列,鎖可以任意**一行也可以,可以自己調整粒度

from multiprocessing import process,lock

import time,random

def task1(lock):

# 要開始使用了 上鎖

lock.acquire() #就等同於乙個if判斷

print("hello iam jerry")

time.sleep(random.randint(0, 2))

print("gender is boy")

time.sleep(random.randint(0, 2))

print("age is 15")

# 用完了就解鎖

lock.release()

def task2(lock):

lock.acquire()

print("hello iam owen")

time.sleep(random.randint(0,2))

print("gender is girl")

time.sleep(random.randint(0,2))

print("age is 48")

lock.release()

def task3(lock):

lock.acquire()

print("hello iam jason")

time.sleep(random.randint(0,2))

print("gender is women")

time.sleep(random.randint(0,2))

print("age is 26")

lock.release()

if __name__ == '__main__':

lock = lock()

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

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

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

p1.start()

# p1.join()

p2.start()

# p2.join()

p3.start()

# p3.join()

# print("故事結束!")

# 鎖的偽**實現

# if my_lock == false:

# my_lock = true

# #被鎖住的**

my_lock = false 解鎖

1.什麼是ipc程序間通訊

通訊指的就是交換資料,程序之間相互隔離,當乙個程序想要把資料給另乙個程序,就要考慮ipc程序間通訊

2.ipc通訊和socket對比

1)ipc通訊  

管道:上只能單向通訊

檔案:在硬碟上建立共享檔案

缺點:速度慢

優點: 資料量幾乎沒有限制

2)socket通訊

程式設計複雜度較高

共享記憶體:必須由作業系統來分配

缺點:資料量不能太大

優點:速度快

manager所建立出來的資料結構,具備程序共享的特點, 需要強調的是 manager建立的一些資料結構是不帶鎖的 可能會出現問題

from multiprocessing import process,manager,lock

import time

def task(data,l):

l.acquire()

num = data["num"] #

time.sleep(0.1)

data["num"] = num - 1

l.release()

if __name__ == '__main__':

# 讓manager開啟乙個共享的字典

m = manager()

data = m.dict()

l = lock()

for i in range(10):

p = process(target=task,args=(data,l))

p.start()

time.sleep(2)

print(data)

1)什麼是佇列

佇列是一種特殊的資料結構先儲存的先取出,就像排隊一樣,先進先出 

注:堆疊是先儲存後取出,就像衣櫃一樣

from multiprocessing import queue

# 建立佇列 不指定maxsize 則沒有數量限制

q = queue(3)

# 儲存元素

# q.put("abc")

# q.put("hhh")

# q.put("kkk")

# print(q.get())

# q.put("ooo") # 如果容量已經滿了,在呼叫put時將進入阻塞狀態 直到有人從佇列中拿走資料有空位置 才會繼續執行

#取出元素

# print(q.get())# 如果佇列已經空了,在呼叫get時將進入阻塞狀態 直到有人從儲存了新的資料到佇列中 才會繼續

# print(q.get())

# print(q.get())

#block 表示是否阻塞 預設是阻塞的 # 當設定為false 並且隊列為空時 丟擲異常

q.get(block=true,timeout=2)

# block 表示是否阻塞 預設是阻塞的 # 當設定為false 並且佇列滿了時 丟擲異常

# q.put("123",block=false,)

# timeout 表示阻塞的超時時間 ,超過時間還是沒有值或還是沒位置則丟擲異常 僅在block為true有效

1)生產者和消費者模型是什麼

模型就是解決某個問題套路

產生資料的一方稱之為生產者

處理資料的一方稱之為消費者

2)生產者和消費者解決什麼問題

處理生產者和消費,處理速度不平衡,一方快一方慢,導致一方需要等待另一方

將雙方分開來,一方專門負責生產,一方負責處理

生產者完成後放入容器,消費者從容器中取出資料,這樣就解決了雙方法能力不平衡的問題,做的快的一方而可以繼續做,不需要等待另一方

def eat(q):

for i in range(10):

# 要消費

rose = q.get()

time.sleep(random.randint(0, 2))

print(rose,"吃完了!")

# 生產任務

def make_rose(q):

for i in range(10):

# 再生產

time.sleep(random.randint(0, 2))

print("第%s盤青椒肉絲製作完成!" % i)

rose = "第%s盤青椒肉絲" % i

# 將生成完成的資料放入佇列中

q.put(rose)

if __name__ == '__main__':

# 建立乙個共享佇列

q = queue()

make_p = process(target=make_rose,args=(q,))

eat_p = process(target=eat,args=(q,))

make_p.start()

eat_p.start()

CUDA學習(三十三)

最大化指令吞吐量 為了最大化指令吞吐量,應用程式應 在本節中,吞吐量以每個多處理器每個時鐘週期的操作次數給出。對於32的變形大小,一條指令對應於32個操作,所以如果n是每個時鐘週期的運算元,則指令吞吐量是每個時鐘週期n 32條指令。所有的吞吐量都是針對乙個多處理器的。它們必須乘以裝置中的多處理器數量...

Python學習之旅(三十三)

網路通訊是兩台計算機上的兩個程序之間的通訊,而網路程式設計就是如何在程式中實現兩台計算機的通訊 p協議負責把資料從一台計算機通過網路傳送到另一台計算機 tcp協議則是建立在ip協議之上的。tcp協議負責在兩台計算機之間建立可靠連線,保證資料報按順序到達 許多常用的更高階的協議都是建立在tcp協議基礎...

演算法(三十三)

1 判定字串b是否可由字串a變換的來 比如 abccd acbcd 可以。public boolean fun string a,string b for int i 0 i2.給定形如pattern aabbc city 北京 北京 上海 上海 蓬萊 兩個字串,這樣的pattern和city之間是...