標籤:操作 sem 接收 固定 with dict end json ase
1、簡述電腦作業系統中的“中斷”的作用?
中斷是指在電腦執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得cpu暫時中斷當前正在執行的程式,轉去執行相應的事件處理常式。待處理完畢後又返回原來被中斷處繼續執行或調度新的進程執行的過程。它使電腦可以更好更快利用有限的系統資源解決系統響應速度和運行效率的一種控制技術。
即時響應,系統調度。
2、簡述電腦記憶體中的“核心態”和“使用者態”;
核心態:cpu可以訪問記憶體的所有資料,包括外圍裝置,例如硬碟,網卡,cpu也可以將自己從一個程式切換到另一個程式。使用者態:只能受限的訪問記憶體,且不允許訪問外圍裝置,佔用cpu的能力被剝奪,cpu資源可以被其他程式擷取。為什麼要有使用者態和核心態? 由於需要限制不同的程式之間的訪問能力,防止他們擷取別的程式的記憶體資料,或者擷取外圍裝置的資料,並發送到網路, cpu劃分出兩個許可權等級:使用者態和核心態。
3、處理序間通訊方式有哪些?
進程指:正在執行的一個程式或者說一個任務,負責執行任務的是cpu。進程是用來把資源集中到一起的,進程是資源單位,或者說資源集合。
處理序間通訊(IPC)
訊息佇列( 隊列
=
管道
+
鎖)
管道(使用訊息傳遞的)
有名管道(FIFO)
訊號量
共用記憶體
通訊端(socket)4、簡述你對管道、隊列的理解;
管道通常指無名管道1、它是半雙工的(即資料只能在一個方向上流動),具有固定的讀端和寫端2、它只能用於具有親緣關係的進程中通訊(也就是父與子進程或者兄弟進程之間)3、資料不可反覆讀取了,即讀了之後歡喜紅區中就沒有了訊息佇列1、訊息佇列是面向記錄的,其中的訊息具有特定的格式以及特定的優先順序2、訊息佇列獨立於發送與接收進程。進程終止時,訊息佇列及其內容不會被刪除。3、訊息佇列可以實現訊息隨機查詢。 隊列 = 管道 + 鎖
5、請列舉你知道的處理序間通訊方式;
隊列,訊號量(Semaphore),Event事件,定時器Timer,線程queue,進程池和線程池,非同步呼叫+回調機制
6、什麼是同步I/O,什麼是非同步I/O?
同步I/O操作:實際的I/O操作將導致請求進程阻塞,直到I/O操作完成。
非同步I/O操作:實際的I/O操作不導致請求進程阻塞。
同步或者非同步I/O主要是指訪問資料的機制(即實際I/O操作的完成方式),
同步 一般指主動請求並等待I/O操作完畢的方式,I/O操作未完成前,會導致應用進程掛起;
而非同步 指使用者進程觸發IO操作以後便開始做自己的事情,而當IO操作已經完成的時候會得到IO
完成的通知(非同步特點就是通知),這可以使進程在資料讀寫時也不阻塞。
7、請問multiprocessing模組中的Value、Array類的作用是什嗎?舉例說明它們的使用情境
python 多進程通訊Queue Pipe Value Arrayqueue和pipe用來在進程間傳遞訊息;Value + Array 是python中共用記憶體對應檔的方法;速度比較快.
8、請問multiprocessing模組中的Manager類的作用是什嗎?與Value和Array類相比,Manager的優缺點是什嗎?
Python multiprocessing.Manager(進程間共用資料)Python中進程間共用資料,除了基本的queue,pipe和value+array外,還提供了更高層次的封裝。使用multiprocessing.Manager可以簡單地使用這些進階介面。Manager支援的類型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。
9、寫一個程式,包含十個線程,子線程必須等待主線程sleep 10秒鐘之後才執行,並列印目前時間;
from threading import Thread,currentThreadimport datetime,timedef print_time(): time_now = datetime.datetime.now() print(currentThread().getName(),time_now)if __name__ == ‘__main__‘: time.sleep(10) for i in range(10): t = Thread(target=print_time) t.start()Thread-1 2018-10-03 17:46:20.225000Thread-2 2018-10-03 17:46:20.226000Thread-3 2018-10-03 17:46:20.227000Thread-4 2018-10-03 17:46:20.227000Thread-5 2018-10-03 17:46:20.228000Thread-6 2018-10-03 17:46:20.229000Thread-7 2018-10-03 17:46:20.229000Thread-8 2018-10-03 17:46:20.230000Thread-9 2018-10-03 17:46:20.230000Thread-10 2018-10-03 17:46:20.231000
10、寫一個程式,包含十個線程,同時只能有五個子線程並存執行;
方法一、用線程池的方法
from threading import Threadfrom threading import currentThreadfrom concurrent.futures import ThreadPoolExecutorimport timeimport random def task(): print(currentThread().getName()) time.sleep(random.randint(1,3)) if __name__ == ‘__main__‘: pool = ThreadPoolExecutor(5) for i in range(10): pool.submit(task)ThreadPoolExecutor-0_1 2018 10 03 20:37:30ThreadPoolExecutor-0_0 2018 10 03 20:37:30ThreadPoolExecutor-0_2 2018 10 03 20:37:30ThreadPoolExecutor-0_3 2018 10 03 20:37:30ThreadPoolExecutor-0_4 2018 10 03 20:37:30ThreadPoolExecutor-0_0 2018 10 03 20:37:32ThreadPoolExecutor-0_1 2018 10 03 20:37:32ThreadPoolExecutor-0_3 2018 10 03 20:37:32ThreadPoolExecutor-0_4 2018 10 03 20:37:32ThreadPoolExecutor-0_2 2018 10 03 20:37:324.002999782562256
View Code
方法二、用訊號量的方法(Semaphore)
from threading import Thread, Semaphore, currentThreadimport timedef task(): sm.acquire() print(currentThread().getName()) time.sleep(2) sm.release()if __name__ == ‘__main__‘: sm = Semaphore(5) start = time.time() for i in range(10): t = Thread(target=task) t.start() t.join() stop = time.time() print(stop - start)Thread-1Thread-2Thread-3Thread-4Thread-5Thread-6Thread-7Thread-9Thread-8Thread-104.001999855041504
View Code11、寫一個程式,要求使用者輸入使用者名稱和密碼,要求密碼長度不少於6個字元,且必須以字母開頭,如果密碼合法,則將該密碼使用md5演算法加密後的十六進位概要值存入名為password.txt的檔案,超過三次不合法則退出程式;
def start(): count = 3 while count > 0: name = input(‘>>‘).strip() pwd = input(‘>>‘).strip() if len(pwd) >= 6 and pwd[0].isalpha():# isalpha() 方法檢測字串是否只由字母組成。 pwd_md5 = hashlib.md5(pwd.encode(‘utf-8‘)).hexdigest() print(‘輸入成功‘) obj = {‘user_name‘: name, ‘pass_word‘: pwd_md5} with open(‘password.txt‘,‘a‘,encoding=‘utf-8‘)as f: json.dump(obj,f) exit() else: if count == 0: print(‘三次錯誤‘) exit() count -=1 print(f‘輸入錯誤還有{count}次機會‘) continueif __name__ == ‘__main__‘: import hashlib,json start()View Code 12、寫一個程式,使用socketserver模組,實現一個支援同時處理多個用戶端請求的伺服器,要求每次啟動一個新線程處理用戶端請求;
python中的socketserver模組,主要是用來提供伺服器類,並且提供非同步處理的能力。
服務端:import socketserverclass Handler(socketserver.BaseRequestHandler): def handle(self): print(‘new connection:‘, self.client_address) while True: try: data = self.request.recv(1024) if not data: break print(‘client data:‘, data.decode()) self.request.send(data.upper()) except Exception as e: print(e) breakif __name__ == "__main__": server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 8082), Handler) server.serve_forever()用戶端類比多個線程 ---用戶端發送訊息 def start(ip_port): client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(ip_port) client.send(f"{currentThread().getName()} hello".encode(‘utf-8‘)) data = client.recv(1024) print(data.decode(‘utf-8‘))if __name__ == ‘__main__‘: import socket from threading import Thread,currentThread ip_port = (‘127.0.0.1‘,8082) for i in range(20): t = Thread(target=start,args=(ip_port,)) t.start()
並發編程-單元練習題