介紹程序、執行緒的概念、多程序和多執行緒的區別、python中對多程序和多執行緒的不同的實現方式。
一、程序
程序簡單地說是乙個程式在計算機系統中執行的乙個過程,是作業系統資源分配的基本單位,從更深的層面講,是作業系統的一種抽象。如你在電腦上執行了qq這個軟體,這就是乙個程序。
二、執行緒
然而,乙個程式中往往不止乙個邏輯單元,而是存在多個不同導向的**模組。如,你可以執行qq一邊給乙個人傳檔案一邊和另外乙個人聊天,聊天和傳檔案就是乙個程序中執行不同功能(也就是不同導向的邏輯單元)模組,這就是執行緒。也就是說,執行緒是比程序更小的單位,它們是cpu能夠排程的基本單位,同乙個程序內部,所有執行緒共享資源。
三、多程序和多執行緒的區別
這裡只說最重要的兩個區別:1、多程序每個程序都要分配相應的資源,而同乙個程序的多個執行緒資源是共享的;2、程序之間的通訊需要借助中介,而同一程序的執行緒之間可以直接通訊。
四、python對於多程序的實現
1、基本實現方式
使用process類
import os
from multiprocessing import process
def run_proc(name):
print 'child process %s (%s) running...' % (name, os.getpid())
if __name__ == '__main__':
print 'parent process %s.' % os.getpid()
p_list=
for i in range(5):
p = process(target=run_proc, args=(str(i),))
print 'process will start.'
p_list[i].start()
for p in p_list:
p.join()
print 'process end.'
使用pool類
from multiprocessing import pool
import os, time, random
def run_task(name):
print 'task %s (pid = %s) is running...' % (name, os.getpid())
time.sleep(random.random() * 3)
print 'task %s end.' % name
if __name__=='__main__':
print 'current process %s.' % os.getpid()
p = pool(processes=3)
for i in range(5):
print 'waiting for all subprocesses done...'
p.close()
p.join()
print 'all subprocesses done.'
2、程序間的通訊
程序間的同信必須借助媒介,這裡主要介紹queue,同樣是來自multiprocessing模組的queue類,該類本質就是資料結構中的佇列,可以由父程序例項化乙個物件,傳遞給各個子程序,或者將其公布在網路上,由各個程序同步到程序內部,再進行讀取。
五、python對於多執行緒的實現
1、實現方法與多程序類似,只是它這裡是通過threading模組的thread類。
2、多執行緒的鎖
之前說過,乙個程序內的多個執行緒是共享資源,有些資料只能允許單個執行緒修改,這裡就要用到同步鎖。簡而言之,在程序類例項化乙個threading.rlock()物件,在對資料修改前使用acquire方法獲取資源,完成操作後,使用release方法釋放資源。
同步鎖例子
import threading
mylock = threading.rlock()
num=0
class mythread(threading.thread):
def __init__(self, name):
threading.thread.__init__(self,name=name)
def run(self):
global num
while true:
mylock.acquire()
print '%s locked, number: %d'%(threading.current_thread().name, num)
if num>=4:
mylock.release()
print '%s released, number: %d'%(threading.current_thread().name, num)
break
num+=1
print '%s released, number: %d'%(threading.current_thread().name, num)
mylock.release()
if __name__== '__main__':
thread1 = mythread('thread_1')
thread2 = mythread('thread_2')
thread1.start()
thread2.start()
tips1:全域性直譯器鎖(gil)
python同乙個程序內的多個執行緒無法使用多個cpu,乙個程序只能乙個核,無論該程序有多少執行緒,這是語言直譯器層面的約束,無法通過第三方庫來解決。所以對於計算密集型的程式要使用多程序,而對於網路io 密集型的操作可以使用多執行緒。
tips2:join方法
無論是多執行緒還是多程序,我們都用到了乙個方法join,該方法的作用是進/執行緒同步。當進/執行緒執行該方法時,會阻塞其他進/執行緒,當自身執行完之後才允許其他進/執行緒執行。
執行緒池一些知識解答
執行緒的建立和銷毀,維護乙個執行緒池處理多工,更加有效利用cpu。那麼主要是浪費那些資源呢?我們來分析建立乙個執行緒的過程 上面已經提到了,建立乙個執行緒還要呼叫作業系統核心api。為了更好的理解建立並啟動乙個執行緒的開銷,我們需要看看 jvm 在背後幫我們做了哪些事情 這段描述稍稍有點抽象,用資料...
程序 輕量級程序和執行緒的一些點
從核心觀點看,程序的目的就是擔當分配系統資源 cpu 時間 記憶體等 的實體。程序是資源管理的最小單位,執行緒是程式執行的最小單位。在作業系統設計上,從程序演化出執行緒,最主要的目的就是更好的支援 smp以及減小 程序 執行緒 上下文切換開銷。最初的程序定義都包含程式 資源及其執行三部分,其中程式通...
java中多執行緒的一些知識
countdownlatch,乙個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許乙個或多個執行緒一直等待。主要方法 public countdownlatch int count public voidcountdown public voidawait throws interrup...