1. 程式人生 > 其它 >7.20學習日記

7.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