python終止線程怎么解決 為什么我的python多線程不能交替運(yùn)行?
為什么我的python多線程不能交替運(yùn)行?不可以,python目前不適合多線程在多核上運(yùn)行。只能使用單核。如果需要多核,可以考慮多進(jìn)程模式。python selenium多線程怎么用?不同的線程創(chuàng)建不
為什么我的python多線程不能交替運(yùn)行?
不可以,python目前不適合多線程在多核上運(yùn)行。只能使用單核。如果需要多核,可以考慮多進(jìn)程模式。
python selenium多線程怎么用?
不同的線程創(chuàng)建不同的驅(qū)動程序,或者它們可以創(chuàng)建相同的驅(qū)動程序。
python的優(yōu)點(diǎn)不包括什么?
Python的優(yōu)勢不包括以下內(nèi)容:
多線程和速度
Python 的整體性能較慢,有限的線程和多處理能力是其未來發(fā)展的主要障礙。
Python長期以來重視編程的容易程度,而不是運(yùn)行時(shí)的速度。當(dāng)你通過用C或C寫的高速外部庫(比如Numpy和Numba)在Python中完成這么多性能密集型的任務(wù)時(shí),你會發(fā)現(xiàn)Python注重編程的易用性,這也是一個不錯的選擇。然而,Python 的開箱即用性能還是落后于其他語言,比如Nim和Julia,它們的語法一樣簡單,但是可以編譯成機(jī)器碼,具有更高的性能優(yōu)勢。
Python可以 不能充分利用多核處理器,這是一個由來已久的問題。它確實(shí)有線程功能,但是它的線程功能僅限于單核。盡管Python可以使用多個流程,但是調(diào)度和同步這些子流程的結(jié)果并不總是有效的。
打包和可執(zhí)行文件
即使在Python 的誕生,Python仍然沒有很好的方法生成可執(zhí)行文件(
Python多進(jìn)程和多線程是雞肋嘛?
什么是線程?你為什么想要它?本質(zhì)上,Python是一種線性語言,但是當(dāng)你需要更多的處理能力時(shí),線程模塊就會派上用場。Python中的線程雖然不能用于并行CPU計(jì)算,但是非常適合Web抓取等I/O操作,因?yàn)樘幚砥魇强臻e的,在等待數(shù)據(jù)。
線程改變了游戲規(guī)則,因?yàn)樵S多與網(wǎng)絡(luò)/數(shù)據(jù)I/O相關(guān)的腳本花費(fèi)大部分時(shí)間等待來自遠(yuǎn)程源的數(shù)據(jù)。因?yàn)橄螺d可能沒有鏈接(即抓取一個單獨(dú)的網(wǎng)站),所以處理器可以從不同的數(shù)據(jù)源并行下載,最后合并結(jié)果。對于CPU密集型進(jìn)程,使用線程模塊沒有什么好處。
幸運(yùn)的是,標(biāo)準(zhǔn)庫中包含了線程:
可以使用targ:,這基本上是一種確保嵌入其中的代碼只有在腳本直接運(yùn)行(而不是導(dǎo)入)的情況下才能運(yùn)行的方法。
鎖你通常希望你的線程能夠使用或修改線程間的公共變量,但是要做到這一點(diǎn),你必須使用一個叫做鎖的東西。每當(dāng)一個函數(shù)試圖修改一個變量時(shí),它就鎖定它。當(dāng)另一個函數(shù)想要使用一個變量時(shí),它必須等到該變量被解鎖。
想象兩個函數(shù)迭代變量1。使用鎖可以確保一個函數(shù)可以訪問變量、執(zhí)行計(jì)算并寫回變量,然后另一個函數(shù)才能訪問同一個變量。
使用線程模塊時(shí),打印時(shí)也會發(fā)生這種情況,因?yàn)槲谋究赡軙兊没靵y(并導(dǎo)致數(shù)據(jù)損壞)。您可以使用打印鎖來確保一次只能打印一個線程。
在這里,我們有10項(xiàng)工作要做,5名工人將完成這項(xiàng)工作。
多線程并不總是完美的解決方案。我發(fā)現(xiàn)許多指導(dǎo)者傾向于忽略使用他們剛剛試圖教你的工具的負(fù)面影響。理解使用所有這些工具有利也有弊是很重要的。例如:
與管理線程相關(guān)的開銷很高,所以您不需要。;t不想用它做基本任務(wù)(比如例子);
它增加了程序的復(fù)雜性,這將使調(diào)試更加困難。
什么是多重處理?和螺紋有什么區(qū)別?如果沒有多重處理,Python程序?qū)⒉荒茏畲蠡到y(tǒng)的規(guī)格,因?yàn)镚IL(全局解釋器鎖定)。在設(shè)計(jì)Python時(shí),沒有考慮到個人計(jì)算機(jī)可能有多個內(nèi)核(向您展示了該語言的時(shí)代),所以GIL是必要的,因?yàn)镻ython不是線程安全的,并且在訪問Python對象時(shí)有一個全局強(qiáng)制鎖。雖然它并不完美,但它是一種非常有效的內(nèi)存管理機(jī)制。我們能做什么?
多重處理允許你創(chuàng)建可以同時(shí)運(yùn)行的程序(繞過GIL)并使用整個CPU內(nèi)核。雖然和線程庫有本質(zhì)的區(qū)別,但是語法非常相似。多處理庫為每個進(jìn)程提供了自己的Python解釋器和GIL。
因此,與線程相關(guān)的常見問題(如數(shù)據(jù)損壞和死鎖)不再是問題。因?yàn)檫M(jìn)程不共享內(nèi)存,所以它們不能同時(shí)修改同一個內(nèi)存。
讓 開始:如果您有一個共享數(shù)據(jù)庫,請確保在開始一個新進(jìn)程之前等待相關(guān)進(jìn)程完成。
如果您想向進(jìn)程傳遞參數(shù),可以使用args。
這是一個簡明的例子,因?yàn)槟鷷⒁獾綌?shù)字并沒有按照您期望的順序排列。
像線程一樣,多重處理也有它的缺點(diǎn)...您必須選擇它:
數(shù)據(jù)在進(jìn)程間的隨機(jī)移動會導(dǎo)致I/O開銷。整個內(nèi)存被復(fù)制到每個子進(jìn)程,這可能會給更重要的程序造成大量開銷。你應(yīng)該用什么?如果你的代碼有很多I/O或網(wǎng)絡(luò)使用:
多線程是您的最佳選擇,因?yàn)槿绻蠫UI,它的開銷非常低。
多線程,所以你的UI線程不會被鎖定。如果您的代碼受到CPU的限制:
你應(yīng)該使用多重處理(如果你的電腦有多個核心)。