多執行緒,多程式
程式是資源分配的最小單位,執行緒是CPU排程的最小單位
什麼是執行緒
執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程式之中,是程式中的實際運作單位。一條執行緒指的是程式中一個單一順序的控制流,一個程式中可以併發多個執行緒,每條執行緒並行執行不同的任務。一個執行緒是一個execution context(執行上下文),即一個cpu執行時所需要的一串指令。
程式
一個程式的執行例項就是一個程式。每一個程式提供執行程式所需的所有資源。(程式本質上是資源的集合)
程式與執行緒區別
1.同一個程式中的執行緒共享同一記憶體空間,但是程式之間是獨立的。
2.同一個程式中的所有執行緒的資料是共享的(程式通訊),程式之間的資料是獨立的。
3.對主執行緒的修改可能會影響其他執行緒的行為,但是父程式的修改(除了刪除以外)不會影響其他子程式。
4.執行緒是一個上下文的執行指令,而程式則是與運算相關的一簇資源。
5.同一個程式的執行緒之間可以直接通訊,但是程式之間的交流需要藉助中間代理來實現。
6.建立新的執行緒很容易,但是建立新的程式需要對父程式做一次複製。
7.一個執行緒可以操作同一程式的其他執行緒,但是程式只能操作其子程式。
8.執行緒啟動速度快,程式啟動速度慢(但是兩者執行速度沒有可比性)。
http://www.cnblogs.com/whatisfantasy/p/6440585.html
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('子程式已結束')
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值;
相關文章
- Python 多執行緒多程式Python執行緒
- 執行緒以及多執行緒,多程式的選擇執行緒
- Python——程式、執行緒、協程、多程式、多執行緒(個人向)Python執行緒
- 多執行緒和多執行緒同步執行緒
- pytest(13)-多執行緒、多程式執行用例執行緒
- Android中的多程式、多執行緒Android執行緒
- 入門python多執行緒/多程式Python執行緒
- Python的多程式和多執行緒Python執行緒
- pytest多程式/多執行緒執行測試用例執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- python多程式取代多執行緒的探究Python執行緒
- python 多程式和多執行緒學習Python執行緒
- [譯] Python 的多執行緒與多程式Python執行緒
- Python 多執行緒及程式Python執行緒
- 多執行緒系列(1),多執行緒基礎執行緒
- 執行緒與多執行緒執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- a、多執行緒執行緒
- 多執行緒學習一(多執行緒基礎)執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 多執行緒程式設計總結:一、認識多執行緒本質執行緒程式設計
- PHP 的多程式與執行緒PHP執行緒
- python 多執行緒程式設計Python執行緒程式設計
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Python多執行緒程式設計Python執行緒程式設計
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒之初識執行緒執行緒
- Java多執行緒-程式執行堆疊分析Java執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- 使用委託開啟多執行緒(多執行緒深入)執行緒
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- 資料提取方法-多程式多執行緒爬蟲執行緒爬蟲
- python爬蟲入門八:多程式/多執行緒Python爬蟲執行緒
- java多執行緒Java執行緒
- 多執行緒6執行緒
- 多執行緒7執行緒