進(jìn)程與線程
想象在學(xué)校的一個(gè)機(jī)房,有固定數(shù)量的電腦,老師安排了一個(gè)爬蟲任務(wù)讓大家一起完成,每個(gè)學(xué)生使用一臺(tái)電腦爬取部分?jǐn)?shù)據(jù),將數(shù)據(jù)放到一個(gè)公共數(shù)據(jù)庫(kù)。共同資源就像公共數(shù)據(jù)庫(kù),進(jìn)程就像每一個(gè)學(xué)生,每多一個(gè)學(xué)生,就多一個(gè)進(jìn)程來完成這個(gè)任務(wù),機(jī)房里的電腦數(shù)量就像CPU,所以進(jìn)程數(shù)量是CPU決定的,線程就像學(xué)生用一臺(tái)電腦開多個(gè)爬蟲,爬蟲數(shù)量由每臺(tái)電腦的運(yùn)行內(nèi)存決定。
一個(gè)CPU可以有多個(gè)進(jìn)程,一個(gè)進(jìn)程有一個(gè)或多個(gè)線程。
多進(jìn)程
1、導(dǎo)包
from multiprocessing import Process
2、寫兩個(gè)任務(wù)
也就是兩個(gè)函數(shù)
3、創(chuàng)建一個(gè)進(jìn)程
進(jìn)程名字 = Process(target=函數(shù)名字,函數(shù)參數(shù)傳字典或元組,是否守護(hù)進(jìn)程)
4、啟動(dòng)進(jìn)程
進(jìn)程名字.start()
5、是否開啟進(jìn)程守護(hù),一般主進(jìn)程會(huì)等待子進(jìn)程執(zhí)行完畢后再關(guān)閉程序。當(dāng)我們想程序主進(jìn)程跑完,直接銷毀掉未完成的子進(jìn)程,關(guān)閉程序的話,加上一句代碼 :
1.創(chuàng)建進(jìn)程的時(shí)候傳參數(shù)daemon=True
2.進(jìn)程名字.daemon=True
6、進(jìn)程編號(hào)
導(dǎo)包os
獲取當(dāng)前進(jìn)程編號(hào)
獲取當(dāng)前父進(jìn)程的編號(hào)
代碼示例(未開啟進(jìn)程守護(hù))
from multiprocessing import Process
import time
import os
# 一個(gè)寫作業(yè)函數(shù)
def homeWork(name, count):
for i in range(count):
# 打印當(dāng)前進(jìn)程編號(hào)os.getpid()
print("當(dāng)前進(jìn)程編號(hào):", os.getpid())
# 打印當(dāng)前父進(jìn)程編號(hào)os.getppid()
print("當(dāng)前父進(jìn)程編號(hào):", os.getppid())
print(name, "正在寫作業(yè)...")
time.sleep(0.2)
# 一個(gè)打游戲函數(shù)
def game(name, count):
for i in range(count):
# 打印當(dāng)前進(jìn)程編號(hào)os.getpid()
print("當(dāng)前進(jìn)程編號(hào):", os.getpid())
# 打印當(dāng)前父進(jìn)程編號(hào)os.getppid()
print("當(dāng)前父進(jìn)程編號(hào):", os.getppid())
print(name, "正在打游戲...")
time.sleep(0.2)
if __name__ == '__main__':
# 打印當(dāng)前進(jìn)程編號(hào)os.getpid()
print("當(dāng)前進(jìn)程編號(hào):", os.getpid())
# 進(jìn)程1寫作業(yè) 元組傳參
p1 = Process(target=homeWork, args=("進(jìn)程1", 10))
# 進(jìn)程2打游戲 字典傳參
p2 = Process(target=game, kwargs={"name": "進(jìn)程2", "count": 10})
# 啟動(dòng)進(jìn)程
p1.start()
p2.start()
time.sleep(1)
print("主進(jìn)程結(jié)束---------------------------------------------")
未開啟線程守護(hù)的運(yùn)行結(jié)果:
# 可以看到主進(jìn)程結(jié)束的,其子進(jìn)程還在繼續(xù)
當(dāng)前進(jìn)程編號(hào): 14972
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
主進(jìn)程結(jié)束---------------------------------------------
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 5732
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 14752
當(dāng)前父進(jìn)程編號(hào): 14972
進(jìn)程2 正在打游戲...
Process finished with exit code 0
代碼示例(開啟進(jìn)程守護(hù))
from multiprocessing import Process
import time
import os
# 一個(gè)寫作業(yè)函數(shù)
def homeWork(name, count):
for i in range(count):
# 打印當(dāng)前進(jìn)程編號(hào)os.getpid()
print("當(dāng)前進(jìn)程編號(hào):", os.getpid())
# 打印當(dāng)前父進(jìn)程編號(hào)os.getppid()
print("當(dāng)前父進(jìn)程編號(hào):", os.getppid())
print(name, "正在寫作業(yè)...")
time.sleep(0.2)
# 一個(gè)打游戲函數(shù)
def game(name, count):
for i in range(count):
# 打印當(dāng)前進(jìn)程編號(hào)os.getpid()
print("當(dāng)前進(jìn)程編號(hào):", os.getpid())
# 打印當(dāng)前父進(jìn)程編號(hào)os.getppid()
print("當(dāng)前父進(jìn)程編號(hào):", os.getppid())
print(name, "正在打游戲...")
time.sleep(0.2)
if __name__ == '__main__':
# 打印當(dāng)前進(jìn)程編號(hào)os.getpid()
print("當(dāng)前進(jìn)程編號(hào):", os.getpid())
# 進(jìn)程1寫作業(yè) 元組傳參 第一種方法啟動(dòng)進(jìn)程守護(hù)
p1 = Process(target=homeWork, args=("進(jìn)程1", 10), daemon=True)
# 進(jìn)程2打游戲 字典傳參
p2 = Process(target=game, kwargs={"name": "進(jìn)程2", "count": 10})
# 第二種
p2.daemon = True
# 啟動(dòng)進(jìn)程
p1.start()
p2.start()
time.sleep(1)
print("主進(jìn)程---------------------------------------------")
開啟進(jìn)程守護(hù)的運(yùn)行結(jié)果
當(dāng)前進(jìn)程編號(hào): 372
當(dāng)前進(jìn)程編號(hào): 10116
當(dāng)前進(jìn)程編號(hào): 9860
當(dāng)前父進(jìn)程編號(hào): 372
進(jìn)程1 正在寫作業(yè)...
當(dāng)前父進(jìn)程編號(hào): 372
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 9860
當(dāng)前進(jìn)程編號(hào): 10116
當(dāng)前父進(jìn)程編號(hào): 372
進(jìn)程2 正在打游戲...
當(dāng)前父進(jìn)程編號(hào): 372
進(jìn)程1 正在寫作業(yè)...
當(dāng)前進(jìn)程編號(hào): 9860
當(dāng)前進(jìn)程編號(hào): 10116
當(dāng)前父進(jìn)程編號(hào): 372
進(jìn)程1 正在寫作業(yè)...
當(dāng)前父進(jìn)程編號(hào): 372
進(jìn)程2 正在打游戲...
當(dāng)前進(jìn)程編號(hào): 9860
當(dāng)前進(jìn)程編號(hào): 10116
當(dāng)前父進(jìn)程編號(hào): 372
進(jìn)程1 正在寫作業(yè)...
當(dāng)前父進(jìn)程編號(hào): 372
進(jìn)程2 正在打游戲...
主進(jìn)程結(jié)束---------------------------------------------
Process finished with exit code 0
多線程
1、導(dǎo)包
2、寫兩個(gè)任務(wù)
也就是兩個(gè)函數(shù)
3、創(chuàng)建一個(gè)線程
線程名字 = threading.Thread(target=函數(shù)名字,函數(shù)參數(shù)傳字典或元組,是否守護(hù)進(jìn)程)
4、啟動(dòng)線程
線程名字.start()
5、是否開啟線程守護(hù),一般當(dāng)前程序會(huì)等待子線程執(zhí)行完畢后再關(guān)閉程序。當(dāng)我們想程序跑完,銷毀掉未完成的子線程,直接關(guān)閉程序的話,加上一句代碼 :
1.創(chuàng)建線程的時(shí)候傳參數(shù)daemon=True
2.線程名字.daemon=True
6、線程編號(hào)
獲取當(dāng)前線程編號(hào)
threading.current_thread()
代碼示例(未開啟進(jìn)程守護(hù))
import threading
import time
# 一個(gè)寫作業(yè)函數(shù)
def homeWork(name, count):
for i in range(count):
# 打印當(dāng)前線程
print(threading.current_thread())
print(name, "正在寫作業(yè)...")
time.sleep(0.2)
# 一個(gè)打游戲函數(shù)
def game(name, count):
for i in range(count):
# 打印當(dāng)前線程
print(threading.current_thread())
print(name, "正在打游戲...")
time.sleep(0.2)
if __name__ == '__main__':
# 線程1寫作業(yè) 元組傳參
t1 = threading.Thread(target=homeWork, args=("進(jìn)程1", 10))
# 線程2打游戲 字典傳參
t2 = threading.Thread(target=game, kwargs={"name": "進(jìn)程2", "count": 10})
# 啟動(dòng)進(jìn)程
t1.start()
t2.start()
time.sleep(1)
print("主進(jìn)程結(jié)束###################################################################################")
未開啟線程守護(hù)的運(yùn)行結(jié)果
# 可以看到主進(jìn)程結(jié)束的,其線程還在繼續(xù)
Thread(Thread-1, started 3364)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-2, started 9100)>
進(jìn)程2 正在打游戲...
Thread(Thread-2, started 9100)>
進(jìn)程2 正在打游戲...
Thread(Thread-1, started 3364)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-1, started 3364)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-2, started 9100)>
進(jìn)程2 正在打游戲...
Thread(Thread-2, started 9100)>
進(jìn)程2 正在打游戲...
Thread(Thread-1, started 3364)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-1, started 3364)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-2, started 9100)>
進(jìn)程2 正在打游戲...
主進(jìn)程結(jié)束###################################################################################
Thread(Thread-2, started 9100)>
進(jìn)程2 正在打游戲...
Thread(Thread-1, started 3364)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-1, started 3364)>
Thread(Thread-2, started 9100)>
進(jìn)程2 正在打游戲...進(jìn)程1
正在寫作業(yè)...
Thread(Thread-1, started 3364)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-2, started 9100)>
進(jìn)程2 正在打游戲...
Thread(Thread-2, started 9100)>Thread(Thread-1, started 3364)>
進(jìn)程1
進(jìn)程2正在寫作業(yè)...
正在打游戲...
Thread(Thread-2, started 9100)>Thread(Thread-1, started 3364)>
進(jìn)程2 進(jìn)程1 正在打游戲...
正在寫作業(yè)...
Process finished with exit code 0
代碼示例(開啟線程守護(hù))
import threading
import time
# 一個(gè)寫作業(yè)函數(shù)
def homeWork(name, count):
for i in range(count):
# 打印當(dāng)前線程
print(threading.current_thread())
print(name, "正在寫作業(yè)...")
time.sleep(0.2)
# 一個(gè)打游戲函數(shù)
def game(name, count):
for i in range(count):
# 打印當(dāng)前線程
print(threading.current_thread())
print(name, "正在打游戲...")
time.sleep(0.2)
if __name__ == '__main__':
# 線程1寫作業(yè) 元組傳參
t1 = threading.Thread(target=homeWork, args=("進(jìn)程1", 10), daemon=True)
# 線程2打游戲 字典傳參
t2 = threading.Thread(target=game, kwargs={"name": "進(jìn)程2", "count": 10})
t2.daemon = True
# 啟動(dòng)進(jìn)程
t1.start()
t2.start()
time.sleep(1)
print("主進(jìn)程結(jié)束###################################################################################")
開啟線程守護(hù)的運(yùn)行結(jié)果
Thread(Thread-1, started daemon 15480)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-2, started daemon 13700)>
進(jìn)程2 正在打游戲...
Thread(Thread-2, started daemon 13700)>
進(jìn)程2 正在打游戲...
Thread(Thread-1, started daemon 15480)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-1, started daemon 15480)>Thread(Thread-2, started daemon 13700)>
進(jìn)程1
進(jìn)程2 正在寫作業(yè)...正在打游戲...
Thread(Thread-2, started daemon 13700)>Thread(Thread-1, started daemon 15480)>
進(jìn)程1進(jìn)程2 正在寫作業(yè)... 正在打游戲...
Thread(Thread-1, started daemon 15480)>
進(jìn)程1 正在寫作業(yè)...
Thread(Thread-2, started daemon 13700)>
進(jìn)程2 正在打游戲...
主進(jìn)程結(jié)束###################################################################################
Process finished with exit code 0
到此這篇關(guān)于Python之多進(jìn)程與多線程的使用的文章就介紹到這了,更多相關(guān)Python 多進(jìn)程與多線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python多進(jìn)程并發(fā)與多線程并發(fā)編程實(shí)例總結(jié)
- Python控制多進(jìn)程與多線程并發(fā)數(shù)總結(jié)
- python多線程與多進(jìn)程及其區(qū)別詳解
- Python多進(jìn)程與多線程的使用場(chǎng)景詳解
- Python并發(fā):多線程與多進(jìn)程的詳解
- 分析詳解python多線程與多進(jìn)程區(qū)別