1. 程式人生 > >python網路基礎之程序,執行緒,協程

python網路基礎之程序,執行緒,協程

程序,協程,執行緒的一些總結

# 1.程序:作業系統分配資源的基本單元,multiprocess模組提供了Process類來代表一個程序物件,這個物件可以理解為是一個獨立的程序,可以執行另外的事情

# 建立程序時,只需要傳入一個執行函式和函式的引數,建立一個 Process 例項,用 start()方法啟動
# target指向函式,相當於呼叫函式,args傳參,由於傳的是元組,一個引數時,引數後面必須加" , "
#   p1 =  multiprocessing.Process(target=download_from_web,args=(q,))
#   p1.start()

# 多程序之間通過佇列(queue先進先出)實現資料共享:建立一個佇列q=multiprocessing.Queue(),
# 一個程序Queue中寫資料q.put(temp),另一個程序從Queue獲取資料q.get()

# 程序池:有多個程序同時執行時,我們可以新增程序池來限制最大程序數
# 匯入程序池:from multiprocessing import Pool
# 定義一個程序池,最大程序數是3,---> po = Pool(3)
# 每次迴圈將會空閒出來的子程序呼叫的目標------>Pool().apply_async(要呼叫的函式,(傳遞給函式的引數元祖))
# po.close() 關閉程序池,關閉後po不再接收新的請求
# po.join()  主程序等待po所有的子程序結束完成,必須放在close後

# 定時器:匯入time模組,time.sleep(time s) ---->讓程序睡多少時間在執行


# 2.執行緒:執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位(被cpu呼叫,看cpu心情分配資源)
# 同一程序中的多個執行緒之間可以併發執行,執行緒有就緒、阻塞和執行三種基本狀態
# 匯入threading模組,提供Thread類來代表一個執行緒物件

# 建立執行緒時,只需要傳入一個執行函式和函式的引數,建立一個 Thread 例項,用 start()方法啟動,格式和程序相似
#   t = threading.Thread(target=service_client, args=(new_socket,))
#   t.start()

# 多執行緒之間可以資源共享,但會造成資源競爭,通過執行緒鎖(互斥鎖Lock)限制某一時刻只有一個執行緒能訪問某個指定的資料
# 建立一個互斥鎖,預設是沒有上鎖的 mutex = threading.Lock() -----相當於許多人上一個廁所,我進去把廁所門鎖住,它們只能等我開鎖自己出來,然後下一個進去
# 在需要上鎖的地方上鎖mutex.acquire(),需要解鎖的時候解鎖mutex.release()


# 3.協程:操作是程式設計師指定的,在python中通過yield,人為的實現併發處理,可以自動切換
# 匯入模組:import gevent
# 由於gevent中有自己的time方法,所以我們只需要匯入monkey:from gevent import monkey--->monkey.patch_all()自動休眠
# 協程gevent是由迭代器,生成器,greenlet等一步步封裝而成的,一般我們直接使用gevent就可以了
# gevent.joinall()將任務和引數進行統一排程,實現單執行緒中的協程,實現併發執行
# gevent.spawn(呼叫函式, 傳遞的引數)


# 程序,執行緒,協程的區別
# 一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒
# 資源分配給程序,同一程序中的所有執行緒共享該程序的所有資源
# 執行緒可以共享,程序不能共享
# 程序佔資源,速度慢,執行緒比程序快,佔資源少,協程有比執行緒快,佔用資源少