天天看點

Python之多程序與多線程程序與線程

多程序與多線程

  • 程序與線程
    • 多程序
    • 多線程

程序與線程

想象在學校的一個機房,有固定數量的電腦,老師安排了一個爬蟲任務讓大家一起完成,每個學生使用一台電腦爬取部分資料,将資料放到一個公共資料庫。共同資源就像公共資料庫,程序就像每一個學生,每多一個學生,就多一個程序來完成這個任務,機房裡的電腦數量就像CPU,是以程序數量是CPU決定的,線程就像學生用一台電腦開多個爬蟲,爬蟲數量由每台電腦的運作記憶體決定。

一個CPU可以有多個程序,一個程序有一個或多個線程。

多程序

1、導包

from multiprocessing import Process

2、寫兩個任務

也就是兩個函數

3、建立一個程序

程序名字 = Process(target=函數名字,函數參數傳字典或元組,是否守護程序)

4、啟動程序

程序名字.start()

5、是否開啟程序守護,一般主程序會等待子程序執行完畢後再關閉程式。當我們想程式主程序跑完,直接銷毀掉未完成的子程序,關閉程式的話,加上一句代碼 :

1.建立程序的時候傳參數daemon=True

2.程序名字.daemon=True

6、程序編号

導包os

擷取目前程序編号

os.getpid()

擷取目前父程序的編号

os.getppid()

代碼示例(未開啟程序守護)

from multiprocessing import Process
import time
import os

# 一個寫作業函數
def homeWork(name, count):
    for i in range(count):
        # 列印目前程序編号os.getpid()
        print("目前程序編号:", os.getpid())

        # 列印目前父程序編号os.getppid()
        print("目前父程序編号:", os.getppid())

        print(name, "正在寫作業...")
        time.sleep(0.2)
# 一個打遊戲函數
def game(name, count):
    for i in range(count):
        # 列印目前程序編号os.getpid()
        print("目前程序編号:", os.getpid())

        # 列印目前父程序編号os.getppid()
        print("目前父程序編号:", os.getppid())

        print(name, "正在打遊戲...")
        time.sleep(0.2)

if __name__ == '__main__':
    # 列印目前程序編号os.getpid()
    print("目前程序編号:", os.getpid())

    # 程序1寫作業 元組傳參
    p1 = Process(target=homeWork, args=("程序1", 10))
    # 程序2打遊戲 字典傳參
    p2 = Process(target=game, kwargs={"name": "程序2", "count": 10})

    # 啟動程序
    p1.start()
    p2.start()
    time.sleep(1)
    print("主程序結束---------------------------------------------")


           

未開啟線程守護的運作結果:

# 可以看到主程序結束的,其子程序還在繼續
目前程序編号: 14972
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
主程序結束---------------------------------------------
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...
目前程序編号: 5732
目前父程序編号: 14972
程序1 正在寫作業...
目前程序編号: 14752
目前父程序編号: 14972
程序2 正在打遊戲...

Process finished with exit code 0
           

代碼示例(開啟程序守護)

from multiprocessing import Process
import time
import os

# 一個寫作業函數
def homeWork(name, count):
    for i in range(count):
        # 列印目前程序編号os.getpid()
        print("目前程序編号:", os.getpid())

        # 列印目前父程序編号os.getppid()
        print("目前父程序編号:", os.getppid())

        print(name, "正在寫作業...")
        time.sleep(0.2)
# 一個打遊戲函數
def game(name, count):
    for i in range(count):
        # 列印目前程序編号os.getpid()
        print("目前程序編号:", os.getpid())

        # 列印目前父程序編号os.getppid()
        print("目前父程序編号:", os.getppid())

        print(name, "正在打遊戲...")
        time.sleep(0.2)

if __name__ == '__main__':
    # 列印目前程序編号os.getpid()
    print("目前程序編号:", os.getpid())

    # 程序1寫作業 元組傳參 第一種方法啟動程序守護
    p1 = Process(target=homeWork, args=("程序1", 10), daemon=True)
    # 程序2打遊戲 字典傳參
    p2 = Process(target=game, kwargs={"name": "程序2", "count": 10})
    # 第二種
    p2.daemon = True
    # 啟動程序
    p1.start()
    p2.start()
    time.sleep(1)
    print("主程序---------------------------------------------")
           

開啟程序守護的運作結果

目前程序編号: 372
目前程序編号: 10116
目前程序編号: 9860
目前父程序編号: 372
程序1 正在寫作業...
目前父程序編号: 372
程序2 正在打遊戲...
目前程序編号: 9860
目前程序編号: 10116
目前父程序編号: 372
程序2 正在打遊戲...
目前父程序編号: 372
程序1 正在寫作業...
目前程序編号: 9860
目前程序編号: 10116
目前父程序編号: 372
程序1 正在寫作業...
目前父程序編号: 372
程序2 正在打遊戲...
目前程序編号: 9860
目前程序編号: 10116
目前父程序編号: 372
程序1 正在寫作業...
目前父程序編号: 372
程序2 正在打遊戲...
主程序結束---------------------------------------------

Process finished with exit code 0
           

多線程

1、導包

import threading

2、寫兩個任務

也就是兩個函數

3、建立一個線程

線程名字 = threading.Thread(target=函數名字,函數參數傳字典或元組,是否守護程序)

4、啟動線程

線程名字.start()

5、是否開啟線程守護,一般目前程式會等待子線程執行完畢後再關閉程式。當我們想程式跑完,銷毀掉未完成的子線程,直接關閉程式的話,加上一句代碼 :

1.建立線程的時候傳參數daemon=True

2.線程名字.daemon=True

6、線程編号

擷取目前線程編号

threading.current_thread()

代碼示例(未開啟程序守護)

import threading
import time

# 一個寫作業函數
def homeWork(name, count):
    for i in range(count):
        # 列印目前線程
        print(threading.current_thread())
        print(name, "正在寫作業...")
        time.sleep(0.2)
# 一個打遊戲函數
def game(name, count):
    for i in range(count):
        # 列印目前線程
        print(threading.current_thread())
        print(name, "正在打遊戲...")
        time.sleep(0.2)

if __name__ == '__main__':

    # 線程1寫作業 元組傳參
    t1 = threading.Thread(target=homeWork, args=("程序1", 10))
    # 線程2打遊戲 字典傳參
    t2 = threading.Thread(target=game, kwargs={"name": "程序2", "count": 10})

    # 啟動程序
    t1.start()
    t2.start()
    time.sleep(1)
    print("主程序結束###################################################################################")

           

未開啟線程守護的運作結果

# 可以看到主程序結束的,其線程還在繼續
<Thread(Thread-1, started 3364)>
程序1 正在寫作業...
<Thread(Thread-2, started 9100)>
程序2 正在打遊戲...
<Thread(Thread-2, started 9100)>
程序2 正在打遊戲...
<Thread(Thread-1, started 3364)>
程序1 正在寫作業...
<Thread(Thread-1, started 3364)>
程序1 正在寫作業...
<Thread(Thread-2, started 9100)>
程序2 正在打遊戲...
<Thread(Thread-2, started 9100)>
程序2 正在打遊戲...
<Thread(Thread-1, started 3364)>
程序1 正在寫作業...
<Thread(Thread-1, started 3364)>
程序1 正在寫作業...
<Thread(Thread-2, started 9100)>
程序2 正在打遊戲...
主程序結束###################################################################################
<Thread(Thread-2, started 9100)>
程序2 正在打遊戲...
<Thread(Thread-1, started 3364)>
程序1 正在寫作業...
<Thread(Thread-1, started 3364)>
<Thread(Thread-2, started 9100)>
程序2 正在打遊戲...程序1 
正在寫作業...
<Thread(Thread-1, started 3364)>
程序1 正在寫作業...
<Thread(Thread-2, started 9100)>
程序2 正在打遊戲...
<Thread(Thread-2, started 9100)><Thread(Thread-1, started 3364)>
程序1 
程序2正在寫作業...
 正在打遊戲...
<Thread(Thread-2, started 9100)><Thread(Thread-1, started 3364)>

程序2 程序1 正在打遊戲...
正在寫作業...

Process finished with exit code 0

           

代碼示例(開啟線程守護)

import threading
import time


# 一個寫作業函數
def homeWork(name, count):
    for i in range(count):
        # 列印目前線程
        print(threading.current_thread())
        print(name, "正在寫作業...")
        time.sleep(0.2)
# 一個打遊戲函數
def game(name, count):
    for i in range(count):
        # 列印目前線程
        print(threading.current_thread())
        print(name, "正在打遊戲...")
        time.sleep(0.2)

if __name__ == '__main__':

    # 線程1寫作業 元組傳參
    t1 = threading.Thread(target=homeWork, args=("程序1", 10), daemon=True)
    # 線程2打遊戲 字典傳參
    t2 = threading.Thread(target=game, kwargs={"name": "程序2", "count": 10})
    t2.daemon = True

    # 啟動程序
    t1.start()
    t2.start()
    time.sleep(1)
    print("主程序結束###################################################################################")

           

開啟線程守護的運作結果

<Thread(Thread-1, started daemon 15480)>
程序1 正在寫作業...
<Thread(Thread-2, started daemon 13700)>
程序2 正在打遊戲...
<Thread(Thread-2, started daemon 13700)>
程序2 正在打遊戲...
<Thread(Thread-1, started daemon 15480)>
程序1 正在寫作業...
<Thread(Thread-1, started daemon 15480)><Thread(Thread-2, started daemon 13700)>
程序1 
程序2 正在寫作業...正在打遊戲...

<Thread(Thread-2, started daemon 13700)><Thread(Thread-1, started daemon 15480)>

程序1程序2 正在寫作業... 正在打遊戲...

<Thread(Thread-1, started daemon 15480)>
程序1 正在寫作業...
<Thread(Thread-2, started daemon 13700)>
程序2 正在打遊戲...
主程序結束###################################################################################

Process finished with exit code 0
           
Python之多程式與多線程程式與線程

原創不易,請給部落客一個小小的贊吧~