程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python面試題之Python中的線程同步

編輯:Python

一、setDaemon(False)當一個進程啟動之後,會默認產生一個主線程,因為線程是程序執行的最小單位,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下就是setDemon(False),主線程執行完自己的任務之後,就退出了,此時子線程會繼續執行自己的任務,知道自己的任務結束。

1、例子:不加setDaemon()或者setDaemon(False)

import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.start()
print('主線程執行完畢')

執行結果:

子線程0開始執行主線程執行完畢
子線程0結束執行
子線程1開始執行
子線程1結束執行
子線程2開始執行
子線程2結束執行
子線程3開始執行
子線程3結束執行
子線程4開始執行
子線程4結束執行

二、setDaemon(True) 當我們使用setDaemon(True)時,這是子線程為守護線程,主線程一旦執行結束,則全部子線程被強制終止

2、例子:setDaemon(True)

import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.setDaemon(True)
t.start()
print('主線程執行完畢')

執行結果:

子線程0開始執行主線程執行完畢

三、 join(線程同步): join 所完成的工作就是線程同步,即主線程任務結束以後,進入堵塞狀態,一直等待所有的子線程結束以後,主線程再終止。

如果不設置timeout參數就等子線程結束主線程再結束

3、例子:t.join()

import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.start()
t.join()
print('主線程執行完畢')

執行結果:

子線程0開始執行
子線程0結束執行
子線程1開始執行
子線程1結束執行
子線程2開始執行
子線程2結束執行
子線程3開始執行
子線程3結束執行
子線程4開始執行
子線程4結束執行
主線程執行完畢

4、例子:t.join(timeout=3)

import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.start()
t.join(timeout=3)
print('主線程執行完畢')

執行結果:主線程堵塞3s後,主線程結束執行,子線程繼續執行。

子線程0開始執行
子線程0結束執行
子線程1開始執行
主線程執行完畢
子線程1結束執行
子線程2開始執行
子線程2結束執行
子線程3開始執行
子線程3結束執行
子線程4開始執行
子線程4結束執行

5、例子:t.join(timeout=3)和setDaemon(True)

import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.setDaemon(True)
t.start()
t.join(timeout=3)
print('主線程執行完畢')

執行結果:主線程堵塞3s後,主線程結束任務,子線程也強制結束任務

子線程0開始執行
子線程0結束執行
子線程1開始執行
主線程執行完畢


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved