毛毛Python進階之路3——程序,程序多開,守護程序,鎖!
毛毛Python進階之路3——程序,程序多開,守護程序,鎖!
話說在寫進階2 雙端互動的時候已經用到了程序多開socketserver。但那個僅僅侷限在雙端互動的時候,所以現在寫的是啥時兒都可以。妥妥的,安排,安排……
【一個程式至少有一個程序,一個程序至少有一個執行緒!】
多執行緒開啟了在這裡我整理了兩個版本
多執行緒1.0
使用multiprocessing 庫 下的 Process 函式,具體使用方法如下!
from multiprocessing import Process
#在這裡了,為了方便區分到底那位大爺先到,所以引進time庫。
import time
def Ess():
time.sleep(3)
print("這是子執行緒哦!")
def Ecc():
time.sleep(1)
print("這也是子執行緒哦!嘿嘿")
if __name__ == '__main__':
f1 = Process(target=Ess)
f2 = Process(target=Ecc)
f1.start()
f2.start()
time.sleep(2)
print("喲!兩位大爺散步了!巧了")
然後了輸出結果是這樣的,哎呦喂1秒的大爺最厲害了
所以了,此時我們就實現了多程序併發。三個大爺一起賽跑。
多執行緒2.0
Python是一門面向物件的語言,所以了難免會出現好多“物件怪”,不用物件受不了(估計這群人是找不到物件了【手動滑稽】),2.0就是一種用類的方式來解決的併發。【注意:不是 socketserver】
from multiprocessing import Process
import time
import os
class MyProcess(Process):
# 如果你需要傳參就得用這個函式,不需要傳參就不需要!
def __init__(self, can1, can2):
super ().__init__()#一定要記得這句,鑰匙沒有這句話 那個時髦的小夥子會六親不認的!
self.can1 = can1
self.can2 = can2
def run(self):
print("這是一個時髦的小夥子【有物件】",os.getpid())# os.getpid 是用來找到本程序的父程序程序號
print("這個可以輸出他爺爺的程序號",os.getppid())
time.sleep(1)
if __name__ == '__main__':
print("這是小夥子的爺爺",os.getpid())
f1 = MyProcess("爸爸","媽媽")
f1.start()
f2 = MyProcess("爸爸1","媽媽1")
f2.start()
print("喲!一大家子呀!")
下面是輸出結果,仔細觀察程序號,你會發現點不一樣的!悄悄告訴你,主程序的爸爸是pycharm,你不信看下下面!
洗不洗很神奇了,哈哈哈!
咱再來瞅瞅“守護程序”
先說說啥叫守護程序。
守護程序——會隨著主程序程式碼執行完畢而結束的程序!【注意有坑】
【坑】:不是主程序結束,是主程序程式碼執行完畢。比如說:有可能其他子程序沒有執行完畢,程式就沒有執行完畢!
from multiprocessing import Process
import time
def func():
time.sleep(3)
print("哎呦喂,大爺老了,多睡了【3】秒")
def demo():
time.sleep(1)
print("瞧你那熊樣,我就只睡了【1】秒")
if __name__ == '__main__':
f1 = Process(target=func)
f1.start()
f2 = Process(target=demo)
f2.daemon = True
f2.start()
time.sleep(0.5)
#time.sleep(2)
print(f2.is_alive()) #用來判斷程序是否還活著!
print("我是主程序!!!")
這裡了可能有點不好理解
當主程序睡0.5秒的時候,f2在主程序結束前沒有結束所以被強迫結束,也就沒有輸出。如下圖
當主程序睡了2秒時,主程序還沒有結束。子程序f2就已經結束了,所以輸出了,子程序結束了也就False了,如下下圖
最後一個就是 鎖 了!
為什麼會有鎖了?
在多程序開發的時候由於網路延遲或者其他原因出現了網路延遲可能會導致資料偏差,所以【鎖】就出現了!
鎖:給某一段程式碼加上鎖,並且只配備一把鑰匙,很多子執行緒到這裡後會搶這一把鑰匙,搶到的那個就能夠執行下面的的程式碼,執行完後把鑰匙還回來,另外的人又搶,這樣一次只能去一個!雖然會降低效率,但資料安全得到了保障!```python
鎖:
lock = lock()
lock.acquire # 拿鑰匙,開門
lock.release() #還鑰匙,關門
# 鎖
# 火車票
import json
import time
from multiprocessing import Process
from multiprocessing import Lock
def show(i):
with open('ticket') as f:
dic = json.load(f)
print('餘票: %s'%dic['ticket'])
def buy_ticket(i,lock):
lock.acquire() #拿鑰匙進門
with open('ticket') as f:
dic = json.load(f)
time.sleep(0.1)
if dic['ticket'] > 0 :
dic['ticket'] -= 1
print('\033[32m%s買到票了\033[0m'%i)
else:
print('\033[31m%s沒買到票\033[0m'%i)
time.sleep(0.1)
with open('ticket','w') as f:
json.dump(dic,f)
lock.release() # 還鑰匙
if __name__ == '__main__':
for i in range(10):
p = Process(target=show,args=(i,))
p.start()
lock = Lock()
for i in range(10):
p = Process(target=buy_ticket, args=(i,lock))
p.start()
輸出如下
學習就是不斷的記筆記,練習!總有一天,你會感謝那個努力付出的自己!
人生苦短,我學python!