併發編程練習

一、簡述計算機操做系統中的「中斷」的做用?算法

答:中斷是指CPU對系統發生的某個事件作出的一種反應,CPU暫停正在執行的程序,保留現場後自動地轉去執行相應的處理程序,處理完該事件後再返回斷點繼續執行被「打斷」的程序。中斷是CPU處理突發事件的一個重要技術。json

做用:它使計算機能夠更好更快利用有限的系統資源解決系統響應速度和運行效率的一種控制技術,實時響應 + 系統調用服務器

二、簡述計算機內存中的「內核態」和「用戶態」;多線程

答:內核態:運行操做系統的程序,os的數據存放;用戶態:運行用戶程序,用戶進程的數據存放。app

  用戶態的應用程序能夠經過三種方式來訪問內核態的資源:1)系統調用;2)庫函數;3)Shell腳本。
用戶態到內核態的切換:
  1.系統調用 用戶程序主動發起的 軟中斷 os.fork() process
  2.異常 被動的 當CPU正在執行運行在用戶態的程序時,忽然發生某些預先不可知的異常事件,這個時候就會觸發從當前用戶態執行的進程轉向內核態執行相關的異常事件,典型的如缺頁異常。
  3.外圍設備的硬中斷 被動的 外圍設備完成用戶的請求操做後,會像CPU發出中斷信號,此時,CPU就會暫停執行下一條即將要執行的指令,轉而去執行中斷信號對應的處理程序,若是先前執行的指令是在用戶態下,則天然就發生從用戶態到內核態的轉換。dom

三、進程間通訊方式有哪些?異步

答:進程彼此之間互相隔離,要實現進程間通訊(IPC),multiprocessing模塊支持兩種形式:隊列管道,這兩種方式都是使用消息傳遞的socket

四、簡述你對管道、隊列的理解;async

答:隊列 = 管道 + 鎖函數

五、請列舉你知道的進程間通訊方式;

答:隊列,信號量,Event事件,定時器Timer,線程queue,進程池線程池,異步調用+回調機制

六、什麼是同步I/O,什麼是異步I/O?

答:同步(synchronous)IO:就是在發出一個功能調用時,在沒有獲得結果以前,該調用就不會返回。按照這個定義,其實絕大多數函數都是同步調用。可是通常而言,咱們在說同步、異步的時候,特指那些須要其餘部件協做或者須要必定時間完成的任務。

      異步(asynchronous)IO:異步的概念和同步相對。當一個異步功能調用發出後,調用者不能馬上獲得結果。當該異步功能完成後,經過狀態、通知或回調來通知調用者。
"""

七、請問multiprocessing模塊中的Value、Array類的做用是什麼?舉例說明它們的使用場景

答:Value,Array(用於進程通訊,資源共享)

八、請問multiprocessing模塊中的Manager類的做用是什麼?與Value和Array類相比,Manager的優缺點是什麼?

答:Manager(用於資源共享)

九、寫一個程序,包含十個線程,子線程必須等待主線程sleep 10秒鐘以後才執行,並打印當前時間;

from threading import Thread
import time

def task(name):
    print(name, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

if __name__ == '__main__':
    time.sleep(10)
    for i in range(10):
        t = Thread(target=task, args=("線程 %s" % i,))
        t.start()

十、寫一個程序,包含十個線程,同時只能有五個子線程並行執行;

from concurrent.futures import ThreadPoolExecutor
import os,time,random
def task(n):
    print("%s is running" % os.getpid())
    time.sleep(random.randint(1,3))
    return n**2

if __name__ == '__main__':
    executor = ThreadPoolExecutor(5)
    futures=[]
    for i in range(10):
        future = executor.submit(task, i)
        futures.append(future)
    executor.shutdown(True)
    print('++>')
    for future in futures:
        print(future.result())

十一、寫一個程序,要求用戶輸入用戶名和密碼,要求密碼長度很多於6個字符,且必須以字母開頭,若是密碼合法,則將該密碼使用md5算法加密後的十六進制概要值存入名爲password.txt的文件,超過三次不合法則退出程序;

import hashlib
import json
import re

def func():
    count = 0
    while count < 3:
        username = input("username>>>:").strip()
        password = input("password>>>:").strip()
        if len(password) < 6 or not re.search('\A([a-z]|[A-Z])', password):
            count += 1
            print("must match password rule")
        else:
            obj = {
                'username':username,
                'password':hashlib.md5(password.encode('utf-8')).hexdigest()
            }
            json.dump(obj, open('password.txt', 'a', encoding='utf-8'))
            break

if __name__ == '__main__':
    func()

十二、寫一個程序,使用socketserver模塊,實現一個支持同時處理多個客戶端請求的服務器,要求每次啓動一個新線程處理客戶端請求;

###################server#####################
import socketserver

class Handler(socketserver.BaseRequestHandler):    # 必須繼承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)
                break

if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), Handler)  # 實例化對象,實現多線程的socket
    server.serve_forever()   # 事件監聽,並調用handler方法
###################client######################
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
while True:
    msg = input(">>>:").strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    data = client.recv(1024)
    print(data.decode('utf-8'))
相關文章
相關標籤/搜索