python多執行緒與多程序
程序(process)和執行緒(thread)是非常抽象的概念, 也是程式設計師必需掌握的核心知識!!!
多程序和多執行緒程式設計對於**的併發執行,提公升**效率和縮短執行時間至關重要。
程序(process)和執行緒(thread)
程序是作業系統分配資源的最小單元
執行緒是作業系統排程的最小單元
計算機的核心是cpu,它承擔了所有的計算任務。它就像一座工廠,時刻在執行
程序就好比工廠的車間,它代表cpu所能處理的單個任務。任一時刻,cpu總是執行乙個程序,其他程序處於非執行狀態。
乙個車間裡,可以有很多任務人。他們協同完成乙個任務。
執行緒就好比車間裡的工人。乙個程序可以包括多個執行緒。
車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的。這象徵乙個程序的記憶體空間是共享的,每個執行緒都可以使用這些共享記憶體
有些房間最多只能容納乙個人,比如廁所。裡面有人的時候,其他人就不能進去了。這代表乙個執行緒使用某些共享記憶體時,其他執行緒必須等它結束,才能使用這一塊記憶體。
乙個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,後到的人看到上鎖,就在門口排隊,等鎖開啟再進去。這就叫"互斥鎖"(mutual exclusion,縮寫 mutex),防止多個執行緒同時讀寫某一塊記憶體區域。
還有些房間,可以同時容納n個人,比如廚房。也就是說,如果人數大於n,多出來的人只能在外面等著。這好比某些記憶體區域,只能供給固定數目的執行緒使用。
這時的解決方法,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。後到的人發現鑰匙架空了,就知道必須在門口排隊等著了。這種做法叫做"訊號量"(semaphore),用來保證多個執行緒不會互相衝突。
python的multiprocess和threading
multiprocess 多程序
threading 多執行緒
python的多程序程式設計主要依靠multiprocess模組
from multiprocessing import process
import os
import time
def long_time_task(i):
print('子程序:{}-任務:{}'.format(os.getpid(),i))
time.sleep(2)
print('結果:{}'.format(8**20))
if __name__=='__main__':
print('當前母程序: {}'.format(os.getpid()))
start = time.time()
p1 = process(target=long_time_task, args=(1,))
p2 = process(target=long_time_task, args=(2,))
print('等待所有子程序完成。')
p1.start()
p2.start()
p1.join()
p2.join()
end = time.time()
print("總共用時{}秒".format((end - start)))
利用multiprocess模組的pool類建立多程序
下面介紹一下multiprocessing 模組下的pool類的幾個方法:
其作用是向程序池提交需要執行的函式及引數, 各個程序採用非阻塞(非同步)的呼叫方式,即每個子程序只管執行自己的,不管其它程序是否已經完成。
2,close()
關閉程序池(pool),使其不在接受新的任務。
3,terminate()
結束工作程序,不在處理未處理的任務。
4,join()
主程序阻塞等待子程序的退出, join方法要在close或terminate之後使用。
cpu是4核的,一次最多可以同時執行4個程序,所以我開啟了乙個容量為4的程序池。4個程序需要計算5次,你可以想象4個程序並行4次計算任務後,還剩一次計算任務(任務4)沒有完成,系統會等待4個程序完成後重新安排乙個程序來計算。
from multiprocessing import pool, cpu_count
import os
import time
def long_time_task(i):
print('子程序: {} - 任務{}'.format(os.getpid(), i))
time.sleep(2)
print("結果: {}".format(8 ** 20))
if __name__=='__main__':
print("cpu核心數:{}".format(cpu_count()))
print('當前母程序: {}'.format(os.getpid()))
start = time.time()
p = pool(4)
for i in range(5):
print('等待所有子程序完成。')
p.close()
p.join()
end = time.time()
print("總共用時{}秒".format((end - start)))
python直譯器中存在gil(全域性直譯器鎖), 它的作用就是保證同一時刻只有乙個執行緒可以執行**。由於gil的存在,很多人認為python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核cpu的資源,在python中大部分情況需要使用多程序。然而這並意味著python多執行緒程式設計沒有意義
多程序間的資料共享與通訊
from multiprocessing import process, queue
def f(q,n):
q.put([42, n, 'hello'])
if __name__ == '__main__':
q = queue()
p_list=
for i in range(3):
p = process(target=f, args=(q,i))
p.start()
print(q.get())
print(q.get())
print(q.get())
for i in p_list:
i.join()
Python 多執行緒與多程序
前言 以前玩單機或者玩小資料集,都基本不用多執行緒或多程序都能基本滿足需求了 所以沒怎麼了解這方面的東西。但現在玩幾百萬甚至上千萬的資料,甚至集群等東西之後,就有必要學習多執行緒或多程序了。在python中首先要匯入相關的模組 import threading as td import multip...
python 多執行緒與多程序
程序與執行緒的區別 程序 應用程式的執行例項,每乙個執行中的程式就是乙個程序 執行緒 程序的組成部分,乙個程序可以擁有多個執行緒 在多執行緒中,會有乙個主線程來完成整個程序從開始到結束的全部操作,而其他的執行緒會在主線程的執行過程中被建立或退出。python景區賣票系統 多執行緒的應用 import...
python 多程序與多執行緒
由於python gil的存在,讓python 多執行緒很雞肋,很多時候如果有併發的需求,則選擇多程序來實現,但是多程序是很消耗資源的,而且程序之間不能資源共享,而且還會受到機器cpu核心數目的限制,因此在特定場景下針對不同需求會有一些取捨。傳聞對於io密集性的操作,比如,處理多個http 的請求,...