一般來(lái)說(shuō),上面這種情況更多是跳出循環(huán)。
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),青海網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:青海等地區(qū)。青海做網(wǎng)站價(jià)格咨詢:18980820575
break 跳出循環(huán)
continue 跳出本次循環(huán),繼續(xù)執(zhí)行下次循環(huán)
至于退出進(jìn)程
import sys
sys.exit()
return break 都可以終止函數(shù)的運(yùn)行 exit(0) # 無(wú)錯(cuò)誤退出 exit(1) # 有錯(cuò)誤退出這兩條語(yǔ)句一般都會(huì)加在程序的最后 因?yàn)閑xit是迫使系統(tǒng)去終止程序的運(yùn)行
這個(gè)是IDLE的問(wèn)題。
換命令行下調(diào)試程序,就正常了。或者換pycharm 之類完善的IDE中調(diào)試
你給函數(shù)傳遞參數(shù), 但是不讓函數(shù)接收, 多進(jìn)程調(diào)用的函數(shù)就無(wú)法執(zhí)行:
from?multiprocessing?import?Pool
import?os,?time,?random
def?run(i):
print('this?is?son?process?%s'?%?(os.getpid()))
#?time.sleep(random.choice([1,?2,?3]))
if?__name__?==?"__main__":
print('this?is?father?process?%s'?%?(os.getpid()))
p?=?Pool(4)
for?i?in?range(5):
p.apply_async(run,?args=(i,))
p.close()
p.join()
print('father?process?end')
基于官方文檔:
日樂(lè)購(gòu),剛才看到的一個(gè)博客,寫(xiě)的都不太對(duì),還是基于官方的比較穩(wěn)妥
我就是喜歡抄官方的,哈哈
通常我們使用Process實(shí)例化一個(gè)進(jìn)程,并調(diào)用 他的 start() 方法啟動(dòng)它。
這種方法和 Thread 是一樣的。
上圖中,我寫(xiě)了 p.join() 所以主進(jìn)程是 等待 子進(jìn)程執(zhí)行完后,才執(zhí)行 print("運(yùn)行結(jié)束")
否則就是反過(guò)來(lái)了(這個(gè)不一定,看你的語(yǔ)句了,順序其實(shí)是隨機(jī)的)例如:
主進(jìn)加個(gè) sleep
所以不加join() ,其實(shí)子進(jìn)程和主進(jìn)程是各干各的,誰(shuí)也不等誰(shuí)。都執(zhí)行完后,文件運(yùn)行就結(jié)束了
上面我們用了 os.getpid() 和 os.getppid() 獲取 當(dāng)前進(jìn)程,和父進(jìn)程的id
下面就講一下,這兩個(gè)函數(shù)的用法:
os.getpid()
返回當(dāng)前進(jìn)程的id
os.getppid()
返回父進(jìn)程的id。 父進(jìn)程退出后,unix 返回初始化進(jìn)程(1)中的一個(gè)
windows返回相同的id (可能被其他進(jìn)程使用了)
這也就解釋了,為啥我上面 的程序運(yùn)行多次, 第一次打印的parentid 都是 14212 了。
而子進(jìn)程的父級(jí) process id 是調(diào)用他的那個(gè)進(jìn)程的 id : 1940
視頻筆記:
多進(jìn)程:使用大致方法:
參考: 進(jìn)程通信(pipe和queue)
pool.map (函數(shù)可以有return 也可以共享內(nèi)存或queue) 結(jié)果直接是個(gè)列表
poll.apply_async() (同map,只不過(guò)是一個(gè)進(jìn)程,返回結(jié)果用 xx.get() 獲得)
報(bào)錯(cuò):
參考 :
把 pool = Pool() 放到 if name == " main ": 下面初始化搞定。
結(jié)果:
這個(gè)肯定有解釋的
測(cè)試多進(jìn)程計(jì)算效果:
進(jìn)程池運(yùn)行:
結(jié)果:
普通計(jì)算:
我們同樣傳入 1 2 10 三個(gè)參數(shù)測(cè)試:
其實(shí)對(duì)比下來(lái)開(kāi)始快了一半的;
我們把循環(huán)里的數(shù)字去掉一個(gè) 0;
單進(jìn)程:
多進(jìn)程:
兩次測(cè)試 單進(jìn)程/進(jìn)程池 分別為 0.669 和 0.772 幾乎成正比的。
問(wèn)題 二:
視圖:
post 視圖里面
Music 類:
直接報(bào)錯(cuò):
寫(xiě)在 類里面也 在函數(shù)里用 self.pool 調(diào)用也不行,也是相同的錯(cuò)誤。
最后 把 pool = Pool 直接寫(xiě)在 search 函數(shù)里面,奇跡出現(xiàn)了:
前臺(tái)也能顯示搜索的音樂(lè)結(jié)果了
總結(jié)一點(diǎn),進(jìn)程這個(gè)東西,最好 寫(xiě)在 直接運(yùn)行的函數(shù)里面,而不是 一個(gè)函數(shù)跳來(lái)跳去。因?yàn)樽詈罂赡?是在子進(jìn)程的子進(jìn)程運(yùn)行的,這是不許的,會(huì)報(bào)錯(cuò)。
還有一點(diǎn),多進(jìn)程運(yùn)行的函數(shù)對(duì)象,不能是 lambda 函數(shù)。也許lambda 虛擬,在內(nèi)存??
使用 pool.map 子進(jìn)程 函數(shù)報(bào)錯(cuò),導(dǎo)致整個(gè) pool 掛了:
參考:
主要你要,對(duì)函數(shù)內(nèi)部捕獲錯(cuò)誤,而不能讓異常拋出就可以了。
關(guān)于map 傳多個(gè)函數(shù)參數(shù)
我一開(kāi)始,就是正常思維,多個(gè)參數(shù),搞個(gè)元祖,讓參數(shù)一一對(duì)應(yīng)不就行了:
報(bào)錯(cuò):
參考:
普通的 process 當(dāng)讓可以穿多個(gè)參數(shù),map 卻不知道咋傳的。
apply_async 和map 一樣,不知道咋傳的。
最簡(jiǎn)單的方法:
使用 starmap 而不是 map
結(jié)果:
子進(jìn)程結(jié)束
1.8399453163146973
成功拿到結(jié)果了
關(guān)于map 和 starmap 不同的地方看源碼:
關(guān)于apply_async() ,我沒(méi)找到多參數(shù)的方法,大不了用 一個(gè)迭代的 starmap 實(shí)現(xiàn)。哈哈
關(guān)于 上面源碼里面有 itertools.starmap
itertools 用法參考:
有個(gè)問(wèn)題,多進(jìn)程最好不要使用全部的 cpu , 因?yàn)檫@樣可能影響其他任務(wù),所以 在進(jìn)程池 添加 process 參數(shù) 指定,cpu 個(gè)數(shù):
上面就是預(yù)留了 一個(gè)cpu 干其他事的
后面直接使用 Queue 遇到這個(gè)問(wèn)題:
解決:
Manager().Queue() 代替 Queue()
因?yàn)?queue.get() 是堵塞型的,所以可以提前判斷是不是 空的,以免堵塞進(jìn)程。比如下面這樣:
使用 queue.empty() 空為True
python中signal處理僵尸進(jìn)程在windows不能用原因,signalnum為某個(gè)信號(hào),handler為該信號(hào)的處理函數(shù)。我們?cè)谛盘?hào)基礎(chǔ)里提到,進(jìn)程可以無(wú)視信號(hào),可以采取默認(rèn)操作,還可以自定義操作。當(dāng)handler為signal.SIG_IGN時(shí),信號(hào)被無(wú)視(ignore)。當(dāng)handler為singal.SIG_DFL,進(jìn)程采取默認(rèn)操作(default)。當(dāng)handler為一個(gè)函數(shù)名時(shí),進(jìn)程采取函數(shù)中定義的操作。
當(dāng)前名稱:python進(jìn)程函數(shù)不能 python 進(jìn)程 queue
文章URL:http://jinyejixie.com/article30/dosedpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、微信公眾號(hào)、網(wǎng)站導(dǎo)航、網(wǎng)站營(yíng)銷、全網(wǎng)營(yíng)銷推廣、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容