程序與執行緒的一些知識

2021-08-19 02:00:54 字數 2930 閱讀 7388

介紹程序、執行緒的概念、多程序和多執行緒的區別、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...