多程序與多線程
- 程序與線程
-
- 多程序
- 多線程
程序與線程
想象在學校的一個機房,有固定數量的電腦,老師安排了一個爬蟲任務讓大家一起完成,每個學生使用一台電腦爬取部分資料,将資料放到一個公共資料庫。共同資源就像公共資料庫,程序就像每一個學生,每多一個學生,就多一個程序來完成這個任務,機房裡的電腦數量就像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

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