工作中,任務數往往大於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 inheritance01_使用「程序」實現多工
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方法。初始化 ...