導航:首頁 > 編程語言 > python列印線程id

python列印線程id

發布時間:2025-09-20 14:48:48

A. python,windows下,我創建了2個線程來不停接收2個串口的信息,並列印出來。怎麼列印在不同的窗口

直接打開兩個文件,分別往裡面寫收到的數據不就好了

B. 一文帶你讀懂Python線程

Python線程

進程有很多優點,它提供了多道編程,可以提高計算機CPU的利用率。既然進程這么優秀,為什麼還要線程呢?其實,仔細觀察就會發現進程還是有很多缺陷的。

主要體現在一下幾個方面:

進程只能在一個時間做一個任務,如果想同時做兩個任務或多個任務,就必須開啟多個進程去完成多個任務。

進程在執行的過程中如果阻塞,例如等待輸入,整個進程就會掛起,即使進程中有些工作不依賴於輸入的數據,也將無法執行。

每個進程都有自己的獨立空間,所以多進程的創建,銷毀相比於多線程更加耗時,也更加佔用系統資源。

進程是資源分配的最小單位,線程是CPU調度的最小單位,每一個進程中至少有一個線程。

線程與進程的區別

可以歸納為以下4點:

1)地址空間:進程間相互獨立的每個進程都有自己獨立的內存空間,也就是說一個進程內的數據在另一個進程是不可見的。但同一進程中的各線程間數據是共享的。

2)通信:由於每個進程有自己獨立的內存空間,所以進程間通信需要IPC,而進程內的數據對於多個線程來說是共享的,每個線程都可以訪問,所以為了保證數據的一致性,需要使用鎖。

3)調度和切換:線程上下文切換比進程上下文切換要快得多。

4)在多線程操作系統中,進程不是一個可執行的實體,它主要的功能是向操作系統申請一塊內存空間,然後在內存空間中開線程來執行任務,相當於一個容器,容器中的線程才是真正的執行體。一個進程可以包含多個線程,而一個線程是不能包含進程的。因為進程是系統分配資源的最小單位,所以線程不能向操作系統申請自己的空間,但一個線程內可以包含多個線程。

相關推薦:《Python視頻教程》

線程的特點:

在多線程的操作系統中,通常是在一個進程中包括多個線程,每個線程都是作為利用CPU的基本單位,是花費最小開銷的實體。線程具有以下屬性。

1)輕型實體

線程中的實體基本上不擁有系統資源,只是有一點必不可少的、能保證獨立運行的資源。

線程的實體包括程序、數據和TCB。線程是動態概念,它的動態特性由線程式控制制塊TCB(Thread Control Block)描述。

2)獨立調度和分派的基本單位。

在多線程OS中,線程是能獨立運行的基本單位,因而也是獨立調度和分派的基本單位。由於線程很「輕」,故線程的切換非常迅速且開銷小(在同一進程中的)。

3)共享進程資源。

在同一進程中的各個線程,都可以共享該進程所擁有的資源,這首先表現在:所有線程都具有相同的進程id,這意味著,線程可以訪問該進程的每一個內存資源;此外,還可以訪問進程所擁有的已打開文件、定時器、信號量機構等。由於同一個進程內的線程共享內存和文件,所以線程之間互相通信不必調用內核。

4)可並發執行

在一個進程中的多個線程之間,可以並發執行,甚至允許在一個進程中所有線程都能並發執行;同樣,不同進程中的線程也能並發執行,充分利用和發揮了處理機與外圍設備並行工作的能力。

線程的實現可以分為兩類:

用戶級線程(User-Level Thread)和內核級線程(Kernel-Level Thread),後者又稱為內核支持的線程或輕量級進程。在多線程操作系統中,各個系統的實現方式並不相同,在有的系統中實現了用戶級線程,有的系統中實現了內核級線程。

用戶線程和內核線程的區別:

1、內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。

2、用戶級線程的創建、撤消和調度不需要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持線程的創建、撤消和調度都需OS內核提供支持,而且與進程的創建、撤消和調度大體是相同的。

3、用戶級線程執行系統調用指令時將導致其所屬進程被中斷,而內核支持線程執行系統調用指令時,只導致該線程被中斷。

4、在只有用戶級線程的系統內,CPU調度還是以進程為單位,處於運行狀態的進程中的多個線程,由用戶程序控制線程的輪換運行;在有內核支持線程的系統內,CPU調度則以線程為單位,由OS的線程調度程序負責線程的調度。

5、用戶級線程的程序實體是運行在用戶態下的程序,而內核支持線程的程序實體則是可以運行在任何狀態下的程序。

內核線程的優缺點:

優點:當有多個處理機時,一個進程的多個線程可以同時執行。

缺點:由內核進行調度。

用戶線程的優缺點:

優點:

線程的調度不需要內核直接參與,控制簡單。

可以在不支持線程的操作系統中實現。

創建和銷毀線程、線程切換代價等線程管理的代價比內核線程少得多。

允許每個進程定製自己的調度演算法,線程管理比較靈活。

線程能夠利用的表空間和堆棧空間比內核級線程多。

同一進程中只能同時有一個線程在運行,如果有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。另外,頁面失效也會產生同樣的問題。

缺點:

資源調度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時復用。

C. Python中threading的join和setDaemon的區別及用法

Python多線程編程時經常會用到join()和setDaemon()方法,基本用法如下:
join([time]): 等待至線程中止。這阻塞調用線程直至線程的join() 方法被調用中止-正常退出或者拋出未處理的異常-或者是可選的超時發生。
setDaemon,將該線程標記為守護線程或用戶線程

1、join ()方法:主線程A中,創建了子線程B,並且在主線程A中調用了B.join(),那麼,主線程A會在調用的地方等待,直到子線程B完成操作後,才可以接著往下執行,那麼在調用這個線程時可以使用被調用線程的join方法。
原型:join([timeout]),裡面的參數時可選的,代表線程運行的最大時間,即如果超過這個時間,不管這個此線程有沒有執行完畢都會被回收,然後主線程或函數都會接著執行的。

import threadingimport time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('線程結束:'+str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('線程開始:'+str(time.time())) t1.start() print('主線程列印開始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主線程列印結束:' + str(time.time()))

線程開始:1497534590.2784667
主線碰嘩程列印開始:1497534590.2794669
0
1
2
3
4
主線程列印結束:1497534592.279581
999
線程結束:1497534600.2800388
從列印結果可知,線程t1 start後,主線程並沒有等線程t1運行結束後再執行,而是在線程執行的同時,執行了後面的語句。

現在,把join()方法加到啟動線程後面(其他代碼不變)

import threadingimport time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('線程結束:'+str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('線程開始:'+str(time.time())) t1.start() t1.join() print('主線程譽襲列印開始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主線程列印結束:' + str(time.time()))

線程開始:1497535176.5019968
999
線程結束:1497535186.5025687
主線程列印開慶吵兄始:1497535186.5025687
0
1
2
3
4
主線程列印結束:1497535188.5026832
線程t1 start後,主線程停在了join()方法處,等子線程t1結束後,主線程繼續執行join後面的語句。

2、setDaemon()方法。主線程A中,創建了子線程B,並且在主線程A中調用了B.setDaemon(),這個的意思是,把主線程A設置為守護線程,這時候,要是主線程A執行結束了,就不管子線程B是否完成,一並和主線程A退出.這就是setDaemon方法的含義,這基本和join是相反的。此外,還有個要特別注意的:必須在start() 方法調用之前設置。import threading
import time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print("This is:" + self.getName()) # 獲取線程名稱 print('線程結束:' + str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('線程開始:'+str(time.time())) t1.setDaemon(True) t1.start() print('主線程列印開始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主線程列印結束:' + str(time.time()))

線程開始:1497536678.8509264
主線程列印開始:1497536678.8509264
0
1
2
3
4
主線程列印結束:1497536680.8510408

t1.setDaemon(True)的操作,將子線程設置為了守護線程。根據setDaemon()方法的含義,父線程列印內容後便結束了,不管子線程是否執行完畢了。
如果在線程啟動前沒有加t1.setDaemon(True),輸出結果為:
線程開始:1497536865.3215919
主線程列印開始:1497536865.3215919
0
1
2
3
4
主線程列印結束:1497536867.3217063
999
This is:Thread-1
線程結束:1497536875.3221638
程序運行中,執行一個主線程,如果主線程又創建一個子線程,主線程和子線程就分兵兩路,分別運行,那麼當主線程完成想退出時,會檢驗子線程是否完成,如果子線程未完成,則主線程會等待子線程完成後再退出;
有時我們需要的是,子線程運行完,才繼續運行主線程,這時就可以用join方法(在線程啟動後面);
但是有時候我們需要的是,只要主線程完成了,不管子線程是否完成,都要和主線程一起退出,這時就可以用setDaemon方法(在線程啟動前面)。

閱讀全文

與python列印線程id相關的資料

熱點內容
apktool反編譯dex閃退 瀏覽:499
怎麼和女生聊天用啥app 瀏覽:203
如何創造一個好玩的伺服器 瀏覽:1
c語言閏年演算法 瀏覽:841
未加密的信息叫什麼 瀏覽:231
python列印線程id 瀏覽:329
記事本asp源碼 瀏覽:720
合夥程序員 瀏覽:224
ztp是怎麼解壓的 瀏覽:749
安卓手機如何關閉超頻 瀏覽:591
寫單片機程序算什麼行業 瀏覽:32
單片機的p10 瀏覽:357
銑外圓格式編程視頻 瀏覽:245
掛壁式空調壓縮機 瀏覽:706
通信伺服器是什麼意思 瀏覽:392
私有雲與伺服器有什麼區別 瀏覽:378
設計源碼是什麼 瀏覽:514
nioslinux 瀏覽:459
程序員用多大筆記本 瀏覽:674
游戲腳本高級編程英文版 瀏覽:514