1. 程式人生 > >python全棧開發day34-線程Thread

python全棧開發day34-線程Thread

pytho 數據安全 數據隔離 args hide 數據 不同 執行 共享

一、昨日內容回顧

   1. 概念和理論

      進程是計算機資源分配最小單位

      進程三狀態、同步、異步、阻塞、非阻塞

   2. 進程的創建

      實例化、自建類run,start,join,terminate,daemon等

   3.進程的同步控制

       Lock:互斥鎖

      Semaphore:鎖+計數器

      Event:事件

   4.進程間的通信

      隊列Queue:put、get、empty、full、put_nowait、get_nowait 管道+鎖

        進程之間的數據安全--進程安全

        可以是任意數據類型

      管道Pipe:

        有兩端,雙向通信

        需要關閉掉不用的所有端口,才會在recv處報錯

        進程不安全

5.數據共享 Manager:dict,list

       # 進程都在同一臺計算機上使用

      # 數據在進程之間不安全

      目前常用的進程之間的數據共享:消息中間件

        #memcache

        #rabbitmq

        #redis

6.進程池Pool

      #什麽情況下用進程池:

        # 高cpu型的代碼需要用進程池

        #進程池cpu個數+1

      # Pool池

        apply同步

        apply_async 異步提交

          #get 獲取返回值

          #close

          #join

        map

          # apply_async的簡化版,它內部實現了close和join方法

          #但是沒有get方法,無法接受返回值

        回調函數:apply_async(callback=???)

          # 回調函數實在主進程中執行的

7,信號量和進程池的區別,信號量的用處

        #在同一時刻只會有n個進程在執行某段代碼

        #不同:

          #信號量是有多少任務開啟多少進程,信號量仍然給操作系統帶來了很多負擔。

          # 池中進程的數量是固定的,只是分別借用池中的進程來執行任務而已

信號量的用處(同一target函數中,高IO部分用多進程,高CPU部分用信號量計算,這樣節省進程切換等開銷):

        技術分享圖片

二、線程

    1. 線程的概念和特點

為什麽有進程還要開啟線程:

    技術分享圖片

    線程是計算機中能被cpu調度的最小單位:

多線程的特點:並發的、輕量級、數據不隔離

     多進程的特點:並發的、操作笨重、數據隔離

2.線程的開啟

        

技術分享圖片
import json
import time,os
from threading import Thread


def func():
    for i in range(10):
        time.sleep(0.5)
        print(Thread:, i,os.getpid())


if __name__ == __main__:
    t = Thread(target=func)
    t.start()
    time.sleep(1)
    print(in main 1,os.getpid())
    time.sleep(1)
    print(in main 2,os.getpid())
主線程和子線程在同一進程

    3.效率測試

 

技術分享圖片
from multiprocessing import Process
from threading import Thread
import time


def func(num):
    print(num**num)


if __name__ == __main__:
    p_lst = []
    start = time.time()
    for i in range(50):
        p = Process(target=func, args=(i,))
        p.start()
        p_lst.append(p)
    for i in p_lst:
        i.join()
    print(======, time.time()-start)

    t_lst = []
    start = time.time()
    for i in range(50):
        t = Thread(target=func, args=(i,))
        t.start()
        t_lst.append(p)
    for i in t_lst:
        i.join()
    print(********, time.time()-start)
對於高計算任務,多線程高出多進程幾個數量級

    4.數據隔離性測試

技術分享圖片
from threading import Thread

n =100

def func():
    global n
    n -= 1


t = Thread(target=func)
t.start()
t.join()
print(n)
數據隔離,線程共享進程資源

    5.子進程和主進程

技術分享圖片
from threading import Thread,currentThread
import time


def func():
    time.sleep(1)
    print(子進程, currentThread())


t = Thread(target=func)
t.start()
print(主進程, currentThread())   # 主線程結束意味著主進程結束,主線程會等著子線程結束才結束
主線程結束意味著主進程結束,主線程會等著子線程結束才結束

   6.全局解釋器鎖GIL

技術分享圖片

      

python全棧開發day34-線程Thread