線程(一):進程與線程的概念,用基本的thread模塊講解線程含義

# coding:utf-8

'''
進程:重量級進程,就是程序的一次運行。進程擁有獨立的內存空間。
線程:輕量級進程,就是進程分支,同一進程下的線程共享該進程的內存

python虛擬機:python模仿系統運行的一個功能,是單CPU虛擬機,而單CPU無法
              實現真正的多線程

單CPU可以同時執行幾件事? 一件事

爲了能同時運行多個程序,則需要異步併發

通常對兩件事  事件A和事件B  執行順序 事件A --->事件B
時間片:將事件A和事件B,進行切分,事件A1、事件A2、事件A3,事件B1、事件B2、事件B3

異步併發:事件A1--->事件B1--->事件A2---->事件B2--->事件A3--->事件B3

1.線程是進程的分支
2.線程之間相互獨立
3.線程擁有指針
4.線程可以被中斷,也可以被搶佔
5.進程結束而線程沒有結束容易導致殭屍進程
6.線程之間由於共享進程的內存所以數據交互要比進程之間方便

全局解釋器鎖(Global Interpreter Lock):爲了保證單CPU情況下,線程在運行的過程當中不被搶佔
    GIL : 全局解釋器鎖
    GUI :圖形化

    例:
    VIP電梯
    A  9--->1  電梯上鎖
    B  7--->1   電梯被上鎖,B不能再搭乘

    生成鎖 ——> 分配鎖 ——> 獲取鎖 ——> 加鎖 ——> 釋放鎖

    一次性鎖  :一次性的,用完後即消失
    重用鎖    :公共鎖,用完後其它線程還可以繼續用




'''

#---------------------------------------------------------------------------
#線程按順序執行

# import time
#
# def loop0():
#     print("loop0 start at :",time.ctime())
#     time.sleep(3)
#     print("loop0 stop at :",time.ctime())
#
# def loop1():
#     print("loop1 start at :",time.ctime())
#     time.sleep(3)
#     print("loop1 stop at :",time.ctime())
#
# def main():
#     print ('all start at :',time.ctime())
#     loop0()
#     loop1()
#     print ('all stop at :',time.ctime())
#
# if __name__ =="__main__":
#     main()
#----------------------------------------------------------------


#不同的編譯器對線程有影響,以下程序請放在IDLE中執行
import time
import thread

def loop0():
    print("loop0 start at :",time.ctime())
    time.sleep(3)
    print("loop0 stop at :",time.ctime())

def loop1():
    print("loop1 start at :",time.ctime())
    time.sleep(3)
    print("loop1 stop at :",time.ctime())

def main():
    print ('all start at :',time.ctime())
    thread.start_new_thread(loop0,()) #將loop0放入線程當中並且開始執行,注意代碼裏沒有讓它停止,所以在loop0
                                      #睡眠的時候,後面的代碼也會繼續執行,同理loop1也是,相當於同時進行後面的代碼
    thread.start_new_thread(loop1,()) #後面的一個括號是爲了給loop0傳參
                                      #注意,這兩個是不同的線程
    print ('all stop at :',time.ctime())

if __name__ =="__main__":
    main()                             #結果是main()函數執行完後,由於兩個線程還沒有結束,還在運行,如果
                                       #將main()當作主函數看待,這相當於進程結束了線程沒有結束,是殭屍進程
                                       #可以在兩個線程後 time.sleep(7) 這4秒內兩個線程已經結束了,主程序也再4S後結束。
發佈了14 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章