什么是線程:
線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位(程序執(zhí)行流的最小單元)。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。(線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單元)
線程和進(jìn)程的區(qū)別:
(1)線程共享內(nèi)存空間;進(jìn)程的內(nèi)存是獨(dú)立的
(2)同一個(gè)進(jìn)程的線程之間可以直接交流;兩個(gè)進(jìn)程想通信,必須通過一個(gè)中間代理來實(shí)現(xiàn)
(3)創(chuàng)建新線程很簡單; 創(chuàng)建新進(jìn)程需要對(duì)其父進(jìn)程進(jìn)行一次克隆
(4)一個(gè)線程可以控制和操作同一進(jìn)程里的其他線程;但是進(jìn)程只能操作子進(jìn)程
(5)改變主線程(如優(yōu)先權(quán)),可能會(huì)影響其它線程;改變父進(jìn)程,不影響子進(jìn)程
現(xiàn)在pc都是多核的,使用多線程能充分利用 CPU 來提供程序的執(zhí)行效率
線程:
線程是一個(gè)基本的 CPU 執(zhí)行單元,它必須依托于進(jìn)程存活
進(jìn)程:
進(jìn)程是指一個(gè)程序在給定數(shù)據(jù)集合上的一次執(zhí)行過程,是系統(tǒng)進(jìn)行資源分配和運(yùn)行調(diào)用的獨(dú)立單位。
可以簡單地理解為操作系統(tǒng)中正在執(zhí)行的程序。也就說,每個(gè)應(yīng)用程序都有一個(gè)自己的進(jìn)程
每一個(gè)進(jìn)程啟動(dòng)時(shí)都會(huì)最先產(chǎn)生一個(gè)線程,即主線程。然后主線程會(huì)再創(chuàng)建其他的子線程
兩者的區(qū)別
線程必須在某個(gè)進(jìn)行中執(zhí)行。
一個(gè)進(jìn)程可包含多個(gè)線程,其中有且只有一個(gè)主線程。
多線程共享同個(gè)地址空間、打開的文件以及其他資源。
多進(jìn)程共享物理內(nèi)存、磁盤、打印機(jī)以及其他資源
示例:程序中有兩個(gè)線程,一個(gè)主線程,一個(gè)是我們創(chuàng)建的子線程
from threading import Thread
def Foo(arg):
print arg
print 'before'
t1 = Thread(target=Foo,args=(1,))
t1.start()
print t1.getName()
t2 = Thread(target=Foo,args=(2,))
t2.start()
print t2.getName()
print 'after'
#添加t1.setDaemon(True)主線程沒有結(jié)束,那么子線程還會(huì)在執(zhí)行,什么時(shí)候主線程序執(zhí)行完了,子線程序就跟著主線程一起銷毀了。
from threading import Thread
import time
def Foo(arg):
for item in range(10):
print item
time.sleep(1)
print 'before'
t1 = Thread(target=Foo,args=(1,))
t1.setDaemon(True)
t1.start()
print 'after'
time.sleep(5)