Python學習day35-併發編程(1)

 

Python學習day35-併發編程(1)

進程的基礎

顧名思義,進程就是程序正在執行的一個過程.進程的概念最先是來源於操做系統,是操做系統最核心的概念,因此要真正瞭解進程,必須事先了解操做系統.html

http://www.javashuo.com/article/p-cpsqrfkp-c.htmlnode

簡單來講,由於早期的計算機只有一個cpu,也能支持併發(僞並行)的能力.或者是將一個單獨的cpu變成多個虛擬的cpu(也就是多道技術:時間多路複用和空間多多路複用+硬件上支持隔離).python

什麼是進程

官方的話來講,進程(Process)就是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,也是操做系統結構的基礎.linux

狹義來講,進程是正在運行的程序的實例web

廣義來講,進程是一個具備必定獨立功能的程序關於某個數據集合的一次運行活動.是操做系統動態執行的基本單元,在傳統的操做系統中,進程便是基本的分配單元,又是基本的執行單元.shell

同一個程序執行兩次,就會在操做系統中出現兩個進程,這兩個進程是互不干擾的,相互獨立的,因此咱們能夠同時運行一個軟件,分別作不一樣的事情,也不會混亂.編程

進程的並行和併發

  • 併發:併發是指資源有限的狀況下,二者或者更多的使用者輪流使用資源,併發是一種僞並行,實際上併發同一時間仍是隻能被一個使用者使用,只是能夠交替使用,從而提升效率windows

  • 並行:並行是指二者同時執行,是真正的同時執行,不是併發那樣看似像是同時進行,並行的最基礎的條件就是多核,或者說是多個大腦,資源夠用的狀況下,才能夠並行.服務器

    其區別:session

    並行是從微觀上,也就是在一個精確的時間片刻,有不一樣的程序在執行,就必須有多個處理器,來實現並行.

    併發是從宏觀上看的,在一個時間段內能夠看作是同時執行,好比一個服務器要同時處理多個session,其實是併發,而不是並行.

進程的建立和結束

進程的建立

實際上,新進程的建立都是由一個已經存在的進程執行了一個用於建立進程的系統調用而建立的.

  • Windows建立進程是調用的CreateProcess,這個指令負責處理進程的建立,同時也負責把正確的程序裝入新進程裏
  • 在UNIX系統中,系統調用是fork,fork會建立一個與父進程如出一轍的副本,兩者有相同的存儲印象,一樣的環境字符串和一樣的打開文件,實際上在shell解釋器進程中,執行一個命令就會建立一個子進程.子進程和父進程是能夠有隻讀的共享內存區的,可是對於Windows來講,從一開始父進程和子進程的地址空間就是不一樣的.

進程的結束

  1. 正常退出(自願的,linux中用exit,Windows中用ExitProcess,或者各類界面化的關閉,關機等)
  2. 出錯退出(自願的,好比python中文件不存在)
  3. 嚴重錯誤(非自願,執行非法指令,如引用不存在的內存,1/0等,能夠經過捕捉異常來避免這種錯誤)
  4. 被其餘進程殺死(非自願,好比kill -9)

模塊multiprocess

其實究其根原本說,multiprocess不是一個模塊,而是python中一個操做,管理進程的包.其中的multi就是取自mulitiple的多功能的意思.

Process模塊時一個建立進程的模塊,藉助這個模塊咱們就能夠完成進程的建立.

Process模塊的簡單使用

點開Process的源碼,咱們能夠看到如下內容

 
 
 
xxxxxxxxxx
1
25
 
 
 
 
1
class Process(object):
2
    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
3
        self.name = ''
4
        self.daemon = False
5
        self.authkey = None
6
        self.exitcode = None
7
        self.ident = 0
8
        self.pid = 0
9
        self.sentinel = None
10
11
    def run(self):
12
        pass
13
14
    def start(self):
15
        pass
16
17
    def terminate(self):
18
        pass
19
20
    def join(self, timeout=None):
21
        pass
22
23
    def is_alive(self):
24
        return False
25
'''
26
其中的參數含義爲:
27
1. group,默認爲None,不用賦值
28
2. target爲調用對象,能夠是函數,或者類
29
3. args表示調用對象的位置參數元組,注意,必須是元組
30
4. kwargs爲調用對象的字典,注意,必須是字典
31
5. name爲子進程的名稱,這個能夠任意定義
32
33
屬性的含義爲:
34
1. p.daemon(),默認值爲False,若是設置成True就表明p是後臺運行的守護進程,p的父進程終止的時候p也要隨之終止,且p不能建立本身的新進程
35
2. p.name(),就是子進程的名字
36
3. p.pid(),子進程的pid
37
4. p.exitcode(),沒有大用,沒必要理會
38
5. p.authkey(),暫時不用瞭解
39
40
其中的一些方法的含義爲:
41
1. p.run(),進程啓動時會自動運行的方法,沒必要手動去調用,因此咱們能夠在這個方法裏寫入想要實現或者賦值的一些語句
42
2. p.start(),啓動進程,並自動調用子進程中的run(),須要手動調用
43
3. p.terminate(),強制終止進程,但不會進行清理操做,容易產生殭屍進程,要謹慎使用
44
4. p.join(),主線程等待p終止,注意,是主線程在等,p子進程仍是在運行的狀態,括號裏是能夠寫等待超時的時間,可是join只能等待用start開啓的進程,用run開啓的不能用
45
5. p.is_alive(),判斷子進程p是否還在運行,若是在運行返回True,若是沒有運行返回False
46
'''
 
 

很顯然這是一個類,因此咱們能夠經過對這個類實例化來產生對象.

須要注意的幾點是:

  1. 咱們必須用關鍵字的方式來指定參數,好比Process(target = func,name = nick,args = (,))
  2. args是指定的爲target所指的函數的位置參數,是一個元組的形式,至少要有一個逗號,就算只有一個值也要有一個逗號.
相關文章
相關標籤/搜索