python進(jìn)程函數(shù)不能 python 進(jìn)程 queue

python中exit()函數(shù)怎么不能退出進(jìn)程?

一般來(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()

python 函數(shù)調(diào)用不出來(lái),程序直接退出且不報(bào)錯(cuò)

return break 都可以終止函數(shù)的運(yùn)行 exit(0) # 無(wú)錯(cuò)誤退出 exit(1) # 有錯(cuò)誤退出這兩條語(yǔ)句一般都會(huì)加在程序的最后 因?yàn)閑xit是迫使系統(tǒng)去終止程序的運(yùn)行

Python多進(jìn)程中,定義了一個(gè)函數(shù),為什么在多進(jìn)程中沒(méi)有被執(zhí)行?

這個(gè)是IDLE的問(wèn)題。

換命令行下調(diào)試程序,就正常了?;蛘邠Qpycharm 之類完善的IDE中調(diào)試

python進(jìn)程問(wèn)題

你給函數(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')

python 多進(jìn)程

基于官方文檔:

日樂(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不能用

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://www.muchs.cn/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)

成都網(wǎng)站建設(shè)