??由于處理數(shù)據(jù)過多,程序運(yùn)行很慢,就學(xué)習(xí)了一下python開啟多線程與多進(jìn)程的方法,雖然最后也沒用上,但還是記錄總結(jié)一下,以備不時(shí)之需。
??傳送門:進(jìn)程與線程認(rèn)識(shí),進(jìn)程與線程通俗理解
??簡言之,進(jìn)程為資源分配的最小單元,線程為程序執(zhí)行的最小單元
1. threading庫實(shí)現(xiàn)多線程運(yùn)行
??threading庫中的Thread類可以方便地開啟多線程運(yùn)行,Thread類需要傳入兩個(gè)參數(shù),target為需要執(zhí)行的函數(shù),args為函數(shù)的參數(shù),本例中自定義的multithreading函數(shù)具有三個(gè)參數(shù)。
import threading
import time
import os
def multithreading(data, clss, k):
for i in range(5):
time.sleep(3 * (k + 1))
print(k, ":", clss, "--->", data,
"---> 線程id:", threading.get_ident(),
"---> 進(jìn)程id:", os.getpid())
data = ["一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。",
"奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕",
"刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼"]
clss = ["一念關(guān)山", "奉上", "立劍"]
threads = []
for k in range(3):
t = threading.Thread(target=multithreading, args=(data[k], clss[k], k)) # 創(chuàng)建實(shí)例
threads.append(t)
t.start() # 啟動(dòng)線程運(yùn)行
for t in threads:
t.join() # 等待所有線程執(zhí)行完成
??輸出如下,三句話的線程id不同,但進(jìn)程id一樣。不同的線程搶占cpu資源,導(dǎo)致三句話打印混亂,由于延時(shí)差異,“立劍” 線程最后完成。
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 8956 ---> 進(jìn)程id: 1268
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 8956 ---> 進(jìn)程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 5640 ---> 進(jìn)程id: 1268
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 26068 ---> 進(jìn)程id: 1268
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 8956 ---> 進(jìn)程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 5640 ---> 進(jìn)程id: 1268
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 8956 ---> 進(jìn)程id: 1268
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 8956 ---> 進(jìn)程id: 1268
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 26068 ---> 進(jìn)程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 5640 ---> 進(jìn)程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 5640 ---> 進(jìn)程id: 1268
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 26068 ---> 進(jìn)程id: 1268
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 5640 ---> 進(jìn)程id: 1268
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 26068 ---> 進(jìn)程id: 1268
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 26068 ---> 進(jìn)程id: 1268
??
2. multiprocessing庫實(shí)現(xiàn)多進(jìn)程運(yùn)行
??multiprocessing庫使用方法與threading庫相同,其開啟類為Process。
??不過多進(jìn)程運(yùn)行似乎在windows下運(yùn)行有點(diǎn)問題,參考 這篇文章 也沒解決,似乎是windows下可以執(zhí)行但無法顯示,不過在linux下是可以顯示的。
import threading
import multiprocessing
import time
import os
def my_multiprocess(data, clss, k):
for i in range(5):
time.sleep(3 * (k + 1))
print(k, ":", clss, "--->", data,
"---> 線程id:", threading.get_ident(),
"---> 進(jìn)程id:", os.getpid())
data = ["一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。",
"奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕",
"刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼"]
clss = ["一念關(guān)山", "奉上", "立劍"]
processes = []
for k in range(3):
p = multiprocessing.Process(target=my_multiprocess, args=(data[k], clss[k], k))
processes.append(p)
p.start()
for p in processes:
p.join()
??linux下運(yùn)行的輸出如下,三句話的進(jìn)程id不同,但線程id一樣了,這是可以的,線程id只要保證在進(jìn)程中的唯一性就可以啦~
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889018
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889018
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889019
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889018
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889020
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889018
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889019
0 : 一念關(guān)山 ---> 一念月落,一念身錯(cuò),一念關(guān)山難涉過。棋逢過客,執(zhí)子者不問因果。 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889018
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889020
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889019
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889019
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889020
1 : 奉上 ---> 奉上,唯愿去踏破善惡之疊浪,一心并肩赴跌宕 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889019
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889020
2 : 立劍 ---> 刺予我傷口,重生了魂魄,立劍的時(shí)候,疾驟的嘶吼 ---> 線程id: 140066568185664 ---> 進(jìn)程id: 1889020
??
??so:多線程與多進(jìn)程運(yùn)行可以提高Python程序運(yùn)行速度嗎文章來源:http://www.zghlxwxcb.cn/news/detail-783302.html
??Python的全局解釋器鎖(GIL)限制了同一時(shí)刻只有一個(gè)線程可以執(zhí)行Python字節(jié)碼,對(duì)于計(jì)算密集型任務(wù),多線程往往無法提高程序的執(zhí)行速度,但對(duì)于IO密集型任務(wù),多線程可以利用IO阻塞等待時(shí)的空閑時(shí)間執(zhí)行其他線程,提升運(yùn)行效率。
??多進(jìn)程則可以有效地避免GIL的限制,允許同時(shí)執(zhí)行多個(gè)進(jìn)程,從而提高程序的執(zhí)行速度。文章來源地址http://www.zghlxwxcb.cn/news/detail-783302.html
到了這里,關(guān)于【神行百里】python開啟多線程(threading)與多進(jìn)程(multiprocessing)運(yùn)行的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!