python并發(fā)編程

一、引子

顧名思義,進程即正在執(zhí)行的一個過程。進程是對正在運行程序的一個抽象。

進程的概念起源于操作系統(tǒng),是操作系統(tǒng)最核心的概念,也是操作系統(tǒng)提供的最古老也是最重要的抽象概念之一。操作系統(tǒng)的其他所有內(nèi)容都是圍繞進程的概念展開的。

所以想要真正了解進程,必須事先了解操作系統(tǒng)

二、總結(jié)

即使可以利用的cpu只有一個(早期的計算機確實如此),也能保證支持(偽)并發(fā)的能力。將一個單獨的cpu變成多個虛擬的cpu(多道技術:時間多路復用和空間多路復用+硬件上支持隔離),沒有進程的抽象,現(xiàn)代計算機將不復存在。

一,什么是線程

  在傳統(tǒng)操作系統(tǒng)中,每個進程有一個地址空間,而且默認就有一個控制線程

  線程顧名思義,就是一條流水線工作的過程(流水線的工作需要電源,電源就相當于cpu),而一條流水線必須屬于一個車間,一個車間的工作過程是一個進程,車間負責把資源整合到一起,是一個資源單位,而一個車間內(nèi)至少有一條流水線。

  所以,進程只是用來把資源集中到一起(進程只是一個資源單位,或者說資源集合),而線程才是cpu上的執(zhí)行單位。

  多線程(即多個控制線程)的概念是,在一個進程中存在多個線程,多個線程共享該進程的地址空間,相當于一個車間內(nèi)有多條流水線,都共用一個車間的資源。例如,北京地鐵與上海地鐵是不同的進程,而北京地鐵里的13號線是一個線程,北京地鐵所有的線路共享北京地鐵所有的資源,比如所有的乘客可以被所有線路拉。

二,線程和進程的區(qū)別

Threads share the address space of the process that created it; processes have their own address space.

Threads have direct access to the data segment of its process; processes have their own copy of the data segment of the parent process.

Threads can directly communicate with other threads of its process; processes must use interprocess communication to communicate with sibling processes.

New threads are easily created; new processes require duplication of the parent process.

Threads can exercise considerable control over threads of the same process; processes can only exercise control over child processes.

Changes to the main thread (cancellation, priority change, etc.) may affect the behavior of the other threads of the process; changes to the parent process does not affect child processes.

1,線程共享創(chuàng)建它的進程的地址空間;進程有自己的地址空間。


2,線程可以直接訪問其進程的數(shù)據(jù)段;進程有自己的父進程數(shù)據(jù)段的副本。


3,線程可以直接與進程的其他線程通信;進程必須使用進程間通信來與同胞進程通信。


4,新線程很容易創(chuàng)建;新進程需要父進程的重復。


5,線程可以對相同進程的線程進行相當大的控制;進程只能對子進程進行控制。


6,對主線程的更改(取消、優(yōu)先級更改等)可能會影響進程的其他線程的行為;對父進程的更改不會影響子進程。

總結(jié)上述區(qū)別,無非兩個關鍵點,這也是我們在特定的場景下需要使用多線程的原因:

1.同一個進程內(nèi)的多個線程共享該進程內(nèi)的地址資源

2.創(chuàng)建線程的開銷要遠小于創(chuàng)建進程的開銷(創(chuàng)建一個進程,就是創(chuàng)建一個車間,涉及到申請空間,而且在該空間內(nèi)建至少一條流水線,但創(chuàng)建線程,就只是在一個車間內(nèi)造一條流水線,無需申請空間,所以創(chuàng)建開銷?。?/p>

三,多線程應用舉例

  開啟一個字處理軟件進程,該進程肯定需要辦不止一件事情,比如監(jiān)聽鍵盤輸入,處理文字,定時自動將文字保存到硬盤,這三個任務操作的都是同一塊數(shù)據(jù),因而不能用多進程。只能在一個進程里并發(fā)地開啟三個線程,如果是單線程,那就只能是,鍵盤輸入時,不能處理文字和自動保存,自動保存時又不能輸入和處理文字。

?四,threading模塊介紹

  multiprocess模塊的完全模仿了threading模塊的接口,二者在使用層面,有很大的相似性,因而不再詳細介紹

五,開啟線程的兩種方式

方式一:

import?time

import?random

from?threading?import?Thread


def?study(name):

????print("%s is learning"%name)

????time.sleep(random.randint(1,3))

????print("%s is playing"?%?name)


if?__name__?==?'__main__':

????t?=?Thread(target=study,args=('james',))

????t.start()

????print("主線程開始運行....")

  結(jié)果:

james?is?learning

主線程開始運行....

james?is?playing

方式二:

from?threading?import?Thread

import?time


class?MyThread(Thread):

????def?__init__(self,name):

????????super().__init__()

????????self.name?=?name


????def?run(self):

????????print('%s is learning'?%?self.name)

????????time.sleep(2)

????????print('%s is playing'%self.name)


if?__name__?==?'__main__':

????t1?=?MyThread('james')

????t1.start()

????print("主線程開始運行....")

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容