1)什麼是守護程序
程序是乙個正在執行的程式,守護程序也是乙個程序,守護程序的意思就是乙個程序保護另乙個程序
2)守護程序使用場景
1)什麼是互斥鎖
互斥鎖就是互相排斥的鎖,(乙個資源被鎖了,其他子程序就無法使用)
2)為什麼需要互斥鎖
因為併發帶來的資源競爭問題,當多個程序同時要操作乙個資源將會導致資料錯亂
3)解決資料混亂的方法
1 . 使用join()可以解決資料混亂,但是會把併發任務變成了序列,雖然解決了資料錯亂的問題,但是效率降低了,這樣就沒有開啟子程序了
2. 原本多個程序之間是公平競爭,join執行的順序就定死了,這不合理
3. 給公共資源加鎖,互斥鎖
4)鎖和join的區別
1. join是固定執行順序,會造成父程序等待子程序,鎖依然是公平競爭,誰先搶到誰先執行,父程序可以做其他的事情
2. 最主要的區別:join是把程序全部序列,鎖可以任意**一行也可以,可以自己調整粒度
from multiprocessing import process,lockimport 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,lockimport 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之間是...