7.20學習日記
阿新 • • 發佈:2021-07-20
同步非同步阻塞非阻塞
並行:指的是兩者同時執行,比如賽跑
併發:指的是在資源有限的情況下,兩者交替輪流使用資源
同步:一個任務如果需要依賴另一個任務的完成,就會等到另一個任務完成才會完成現在的任務
非同步:一個任務如果需要依賴另一個任務的完成,就會優先完成手上的任務,再等到另一個任務完成
阻塞:等待另一個任務完成的狀態叫作阻塞
非阻塞:等待的時候時不時的查詢另一個任務的完成情況
效率最低的同步阻塞
效率最高的非同步非阻塞
開啟程序
from multiprocessing import Process
def write():
with open('abc','a')as f:
f.write('a')
f.write('\n')
# window中要想開啟程序,必須放在main裡
if __name__ == '__main__':
# 1.開啟程序先例項化,得到程序物件
# target => 你要執行的任務
# 通知操作提現開啟程序
p = Process(target = write)
# 2.必須呼叫start方法
p.start()
process類
process類的引數
target :指定你要執行的任務
name :程序名
arge :傳位置引數
kwarge :以字典的方式傳引數
process類的方法
p.start() 開啟程序必須使用
p.join() 等待子程序執行完畢再執行主程序
p.run() 呼叫run方法不會啟動子程序,第二種開啟程序的方式,需要用到run方法,重寫run方法
p.terminate() 殺死程序
p.is_alive() 判斷程序是否存活
process類的屬性
p.name 程序名
p.pid 程序id號
p.daemon = True 設定守護程序 主程序結束,子程序也結束,必須放在start之前
獲取程序id號
import os
def write():
print('子程序的id號%s' % os.getpid())
print('父程序的id號%s' % os.getppid())
同時執行多個程序
def write(i):
time.sleep(1)
print('i')
if __name__ == '__main__':
# 同時執行5個程序
for i in range(5):
p = Process(target = write,arge = (i))
p.start()
# 同時執行5個程序,並且順序執行
def write(i):
time.sleep(1)
print('i')
if __name__ == '__main__':
ll = []
for i in range(5):
p = Process(target = write,arge = (i))
p.start()
ll.append(p)
for j in ll:
j.join()
高併發下的tcp服務端
import socket
from multiprocessing import Process
def task(sock):
while True:
try:
data = sock.recv(1024)
if len(data) == 0:
break
print(data)
sock.send(data.upper())
except Exception as e:
print(e)
break
sock.close()
if __name__ == '__main__':
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
print('正在接受訊息')
while True:
sock, addr = server.accept()
print(sock)
print(addr)
p = Process(target = task,args = sock)
p.start()
server.close()
import os,time
from multiprocessing import Process,lock
def task(lock):
# 上鎖
lcok.acquire()
print('程序id%s 開始執行了' % os.getpid())
time.sleep(2)
print('程序id%s 結束執行了' % os.getpid())
# 釋放鎖
lock.release
if __name__ == '__main__':
# 例項化得到一把鎖,5個程序用一把鎖
lock = lock()
for i in range(5):
p = Process(target = task)
p.start