程序池的同步與非同步用法Pool

2022-01-12 23:01:07 字數 3777 閱讀 3606

程序池的同步,如下程式:

from multiprocessing import

pool

import

time

import

osdef

func(n):

print('

start 程序 %s

'%n, os.getpid())

time.sleep(1)

print('

end 程序 %s

'%n, os.getpid())

if__name__ == "

__main__":

pool =pool() # 如果程序池不加數字,預設值為往前cpu的數量一樣

for i in range(10):

檢視結果:

start 程序 0 21896end 程序 0 21896start 程序 1 27040end 程序 1 27040start 程序 2 23408end 程序 2 23408start 程序 3 29704end 程序 3 29704start 程序 4 31384end 程序 4 31384start 程序 5 2140end 程序 5 2140start 程序 6 25780end 程序 6 25780start 程序 7 29488end 程序 7 29488start 程序 8 21896end 程序 8 21896start 程序 9 27040end 程序 9 27040

可以發現,變成了程序變成了同步得了,執行特別慢。

from multiprocessing import

pool

import

time

import

osdef

func(n):

print('

start 程序 %s

'%n, os.getpid())

time.sleep(1)

print('

end 程序 %s

'%n, os.getpid())

if__name__ == "

__main__":

pool =pool()

for i in range(10):

但是發現結果什麼都沒有,因為主程序沒有等子程序的結束就執行完了。

如下優化,使用join就行了:

from multiprocessing import

pool

import

time

import

osdef

func(n):

print('

start 程序 %s

'%n, os.getpid())

time.sleep(1)

print('

end 程序 %s

'%n, os.getpid())

if__name__ == "

__main__":

pool =pool()

for i in range(10):

pool.close() # close()保證的是沒有新的任務進入程序池

pool.join() # 這裡的join檢測的是子程序裡面的任務結束,而不是子程序的結束,因為程序池裡面的程序不會結束,永遠活著,被用完之後會被還到程序池裡面。

看結果:

start 程序 0 22364start 程序 1 25820start 程序 2 27688start 程序 3 26840start 程序 4 31100start 程序 5 27032start 程序 6 21452start 程序 7 25592end 程序 0 22364start 程序 8 22364end 程序 1 25820start 程序 9 25820end 程序 2 27688end 程序 3 26840end 程序 4 31100end 程序 5 27032end 程序 6 21452end 程序 7 25592end 程序 8 22364end 程序 9 25820

值得注意的是,不加pool.close(),直接加pool.join()是會報錯的,因為程序池裡面的程序用完之後不會結束,而是被還到程序池了,因此這裡的join檢測的是沒有任務再進入程序池了,而不是檢測子程序的結束。所以要保證沒有任務進入程序池,程序池就不會接收到任務,所以pool.close()的作用就是結束程序池接收任務,就是我的任務執行完畢,且沒有新的任務進來,這是就被join檢測到了。

另一種問題如下:

from multiprocessing import

pool

import

time

deffunc(n):

time.sleep(0.5)

return n*n

if__name__ == "

__main__":

pool =pool(5)

for i in range(10):

print(ret)

列印結果:

014

9162536

4964

81 # 每隔0.5秒列印乙個結果

from multiprocessing import

pool

import

time

deffunc(n):

time.sleep(0.5)

return n*n

if__name__ == "

__main__":

pool =pool(5)

for i in range(10):

print(ret)

看列印結果:

是乙個個物件,並且是同時列印出來的。

優化如下,使用get()方法獲取值:

from multiprocessing import

pool

import

time

deffunc(n):

time.sleep(0.5)

return n*n

if__name__ == "

__main__":

pool =pool(5)

for i in range(10):

print(ret.get())

看列印結果:

014

9162536

4964

81

值出來的,但是你會發現乙個現象,值是每隔0.5秒乙個乙個出來的,不是非同步嗎???

這裡要注意for迴圈將任務傳入如程序池時,

for i in range(10):

print(ret.get())

執行到print(ret.get()),這裡的get需要獲取值,但是這是沒有值,get就會讓程式出現阻塞直到等到值,所以for迴圈的每一步都要等到值才會繼續下乙個for迴圈,就出現了不是非同步的情況。

改進方法:

from multiprocessing import

pool

import

time

deffunc(n):

time.sleep(0.5)

return n*n

if__name__ == "

__main__":

pool = pool(5)

l_list =

for i in range(10):

for m in

l_list:

print(m.get())

這時候你會發現五個五個的出現。

結束!

程序池的同步與非同步用法Pool

程序池的同步,如下程式 from multiprocessing import pool import time import osdef func n print start 程序 s n,os.getpid time.sleep 1 print end 程序 s n,os.getpid if n...

程序同步與非同步

過程的執行有一定的順序,也就是說必須一步一步執行。舉個例子,在socket中,伺服器accept 等待客戶端的連線,這裡的等待實際上就是阻塞了,在客戶端連線之前,該過程不會往下執行。在同步阻塞中,應用程式執行到需要io操作,會執行乙個系統呼叫,然後講控制權交給核心,此時應用程式便發生的堵塞。核心得到...

python程序與執行緒,同步與非同步,並行併發

from multiprocessing import process,pool import os import time class myprocess process def init self,wtime process.init self self.wtime wtime defrun s...