python高階 三 多工 程序

2021-09-17 01:29:45 字數 3161 閱讀 5624

工作中,任務數往往大於cpu的核數,即一定有一些任務正在執行,而另外一些任務在等待cpu進行執行,因此導致了有了不同的狀態

初始化queue()物件時(例如:q=queue()),若括號中沒有指定最大可接收的訊息數量,或數量為負值,那麼就代表可接受的訊息數量沒有上限(直到記憶體的盡頭);

如果block使用預設值,且沒有設定timeout(單位秒),訊息列隊如果為空,此時程式將被阻塞(停在讀取狀態),直到從訊息列隊讀到訊息為止,如果設定了timeout,則會等待timeout秒,若還沒讀取到任何訊息,則丟擲"queue.empty"異常;

如果block值為false,訊息列隊如果為空,則會立刻丟擲"queue.empty"異常;

如果block使用預設值,且沒有設定timeout(單位秒),訊息列隊如果已經沒有空間可寫入,此時程式將被阻塞(停在寫入狀態),直到從訊息列隊騰出空間為止,如果設定了timeout,則會等待timeout秒,若還沒空間,則丟擲"queue.full"異常;

如果block值為false,訊息列隊如果沒有空間可寫入,則會立刻丟擲"queue.full"異常;

multiprocessing.pool常用函式解析:

lose():關閉pool,使其不再接受新的任務;

terminate():不管任務是否完成,立即終止;

join():主程序阻塞,等待子程序的退出, 必須在close或terminate之後使用;

程序池中的queue:

如果要使用pool建立程序,就需要使用multiprocessing.manager()中的queue(),而不是multiprocessing.queue(),否則會得到一條如下的錯誤資訊:

runtimeerror: queue objects should only be shared between processes through inheritance

01_使用「程序」實現多工
import multiprocessing

import time

deftest1()

:while

true

:print

("-----1-----"

) time.sleep(1)

deftest2()

:while

true

:print

("-----2-----"

) time.sleep(1)

defmain()

: p1 = multiprocessing.process(target=test1)

p2 = multiprocessing.process(target=test2)

p1.start(

) p2.start(

)if __name__ ==

'__main__'

: main(

)

02_queue實現多程序資料共享
import multiprocessing

import time

defdownload_data

(q):

data =[11

,22,33

,44]# 向佇列裡寫資料

for temp in data:

q.put(temp)

# time.sleep(1)

print()

defanalysis_data

(q):

"""模擬資料處理"""

read_data =

list()

# 從佇列中讀取資料

while

true

: data = q.get(

)# 模擬資料處理

print

(read_data)

if q.empty():

break

defmain()

: q = multiprocessing.queue(

) p1 = multiprocessing.process(target=download_data,args=

(q,)

) p2 = multiprocessing.process(target=analysis_data,args=

(q,)

) p1.start(

) p2.start(

)if __name__ ==

'__main__'

: main(

)

執行結果:[11]

[11, 22]

[11, 22, 33]

[11, 22, 33, 44]

[finished in 0.6s]

03_程序池

from multiprocessing import pool

import os, time, random

defworker

(msg)

: t_start = time.time(

)print

("%s開始執行,程序號為%d"

%(msg,os.getpid())

) time.sleep(random.random()*

2)t_stop = time.time(

)print

(msg,

"執行完畢,耗時%0.2f"

%(t_stop-t_start)

)po = pool(3)

for i in

range(0

,10):

(i,)

)print

("-------start-------"

)po.close(

)po.join(

)print

("--------end--------"

)

執行結果:

python 多工 程序

什麼是程序?程式是靜態的,當程式執行起來就叫做程序。程序是作業系統分配資源的基本單元。程序 執行緒的區別與優缺點 1.定義的不同 程序是系統進行資源分配的最小單位.執行緒是程序的乙個實體,是cpu進行排程的基本單位。執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源 如程式計數器,一組...

Python多工之程序

python通過多程序實現多工的幾種方法 只用在類unix linux系統中有效,windows系統中無效 fork函式呼叫一次,返回兩次 在父程序中返回值為子程序id,在子程序中返回值為0 import os ret os.fork if ret 父程序 print 主程序,pid format ...

Python 多工 程序池

高階程式設計技巧 學習筆記 1.1 為什麼要用程序池 當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態生成多個程序,但是如果是上百甚至上千個目標,手動的去建立的程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化 ...