Python多執行緒與多程序

2021-09-25 22:48:16 字數 3140 閱讀 1410

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 的請求,...