多執行緒,多程式

sas???發表於2018-07-01

程式是資源分配的最小單位,執行緒是CPU排程的最小單位

什麼是執行緒

    執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程式之中,是程式中的實際運作單位。一條執行緒指的是程式中一個單一順序的控制流,一個程式中可以併發多個執行緒,每條執行緒並行執行不同的任務。一個執行緒是一個execution context(執行上下文),即一個cpu執行時所需要的一串指令。

程式

    一個程式的執行例項就是一個程式。每一個程式提供執行程式所需的所有資源。(程式本質上是資源的集合)

程式與執行緒區別

    1.同一個程式中的執行緒共享同一記憶體空間,但是程式之間是獨立的。

    2.同一個程式中的所有執行緒的資料是共享的(程式通訊),程式之間的資料是獨立的。

    3.對主執行緒的修改可能會影響其他執行緒的行為,但是父程式的修改(除了刪除以外)不會影響其他子程式。

    4.執行緒是一個上下文的執行指令,而程式則是與運算相關的一簇資源。

    5.同一個程式的執行緒之間可以直接通訊,但是程式之間的交流需要藉助中間代理來實現。

    6.建立新的執行緒很容易,但是建立新的程式需要對父程式做一次複製。

    7.一個執行緒可以操作同一程式的其他執行緒,但是程式只能操作其子程式。

    8.執行緒啟動速度快,程式啟動速度慢(但是兩者執行速度沒有可比性)。

http://www.cnblogs.com/whatisfantasy/p/6440585.html

12558852-c7db5203341ee8a7.png

1)需要頻繁建立銷燬的優先用執行緒

這種原則最常見的應用就是Web伺服器了,來一個連線建立一個執行緒,斷了就銷燬執行緒,要是用程式,建立和銷燬的代價是很難承受的

2)需要進行大量計算的優先使用執行緒

所謂大量計算,當然就是要耗費很多CPU,切換頻繁了,這種情況下執行緒是最合適的。

這種原則最常見的是影像處理、演算法處理。

3)強相關的處理用執行緒,弱相關的處理用程式

什麼叫強相關、弱相關?理論上很難定義,給個簡單的例子就明白了。

一般的Server需要完成如下任務:訊息收發、訊息處理。“訊息收發”和“訊息處理”就是弱相關的任務,而“訊息處理”裡面可能又分為“訊息解碼”、“業務處理”,這兩個任務相對來說相關性就要強多了。因此“訊息收發”和“訊息處理”可以分程式設計,“訊息解碼”、“業務處理”可以分執行緒設計。

當然這種劃分方式不是一成不變的,也可以根據實際情況進行調整。

4)可能要擴充套件到多機分佈的用程式,多核分佈的用執行緒


建立程式:

    Python的os模組封裝了常見的系統呼叫,其中就包括fork,可以在Python程式中輕鬆建立子程式,但fork()函式只能在Linux上面使用:

 import os

    #注意,fork函式,只在Unix/Linux/Mac上執行,windows不可以

    pid = os.fork()

    if pid == 0:

        print('哈哈1')

    else:

        print('哈哈2')

而在windows上面使用multiprocessing模組來建立多程式,這模組是跨平臺的多程式模組

multiprocessing模組提供了一個Process類來代表一個程式物件,下面的例子演示了啟動一個子程式並等待其結束:

#coding=utf-8

from multiprocessing import Process

import os

#子程式要執行的程式碼

def run_proc(name):

    print('子程式執行中,name= %s ,pid=%d...' % (name, os.getpid()))

if __name__=='__main__':

    print('父程式 %d.' % os.getpid())

    p = Process(target=run_proc, args=('test',))

    print('子程式將要執行')

    p.start()

    p.join()

    print('子程式已結束')


12558852-5161e4e2610c7252.png

Process([group [, target [, name [, args [, kwargs]]]]])

· target:表示這個程式例項所呼叫物件;

· args:表示呼叫物件的位置引數元組;

· kwargs:表示呼叫物件的關鍵字引數字典;

· name:為當前程式例項的別名;

· group:大多數情況下用不到;

Process類常用方法:

· is_alive():判斷程式例項是否還在執行;

· join([timeout]):是否等待程式例項執行結束,或等待多少秒;

· start():啟動程式例項(建立子程式);

· run():如果沒有給定target引數,對這個物件呼叫start()方法時,就將執行物件中的run()方法;

· terminate():不管任務是否完成,立即終止;

Process類常用屬性:

· name:當前程式例項別名,預設為Process-N,N為從1開始遞增的整數;

· pid:當前程式例項的PID值;

相關文章