1,程序池
當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態生成多個程序,但如果是上百或者上千個目標,手動的動態建立程序工作量大,此時可以用到multiprocessing中的pool方法。
初始化pool時,可以指定乙個量大的程序數,當有新的請求交到pool中時,如果池還沒有滿,那麼就會建立乙個新的程序用來執行請求,,但如果池中的程序數已經達到指定的最大值,那麼該請求就會待定,直到池中有經常結束,才會用之前的程序來執行新的任務。
併發:交替去做
並行:同時去做
1,程序池的建立
from multiprocessing import pool
import random
import time
import os
defwork
(times)
:print
('這是第{}次的任務,有程序編號{}的程序來完成'
.format
(times, os.getpid())
)if __name__ ==
'__main__'
: pool = pool(3)
# 定義乙個程序池,最大程序數為3
# 十個任務三條程序怎麼完成
for i in
range(0
,10):
(i,)
)
pool.close(
)# 關閉池子,不讓再進新的需求
pool.join(
)#一定要放在close後面
這是第0次的任務,有程序編號6996的程序來完成
這是第1次的任務,有程序編號6996的程序來完成
這是第2次的任務,有程序編號6996的程序來完成
這是第3次的任務,有程序編號6996的程序來完成
這是第4次的任務,有程序編號6996的程序來完成
這是第5次的任務,有程序編號6996的程序來完成
這是第6次的任務,有程序編號6996的程序來完成
這是第7次的任務,有程序編號6996的程序來完成
這是第8次的任務,有程序編號6996的程序來完成
這是第9次的任務,有程序編號6996的程序來完成
join : 指的是所有的子程序完成主程序才結束
2,程序池通訊
from multiprocessing import pool,manager
import time
import os
defread
(que)
:print
('程序啟動,當前的id時{},父程序id是{}'
.format
(os.getpid(
),os.getpid())
)for i in
range(10
):print
('獲取到的資料是{}'
.format
(os.getpid())
)def
write
(que)
:print
('程序啟動,當前的id時{},父程序id是{}'
.format
(os.getpid(
),os.getpid())
)for i in
range(10
):que.put(
'數字'
)if __name__==
'__main__'
:print
('這是主程序的id是{}'
.format
(os.getpid())
)#建立乙個程序池
pool=pool(
)#建立乙個佇列
q=manager(
).queue(
)print
(q)#執行程序池中的程序
(q,)
) time.sleep(1)
#保證寫完再讀
(q,)
)#先關閉程序池
pool.close(
)#進行保護
pool.join(
)print
('這是結束,主程序id是{}'
.format
(os.getpid())
)#os.gtepid()獲取id
2,程序的應用
應用:資料夾copy器(多程序版)
import multiprocessing
import os,time,random
defcopy_file
(queue,file_name,source_folder_name,dest_filder_name)
:'''copy檔案指定的路徑'''
f_read=
open
(source_folder_name+
"/"+file_name,
'rb'
) f_write=
open
(dest_filder_name+
"/"+file_name,
'wb'
)while
true
: time.sleep(random.random())
content=f_read.read(
1024
)if content:
f_write.write(content)
else
:break
f_read.close(
) f_write.close(
)#傳送已經拷貝完畢的檔案名字
queue.put(file_name)
defmain()
:#獲取要複製的資料夾
source_folder_name-
input
('請輸入要複製的檔案名字:'
)#整理目標資料夾
dest_folder_name=source_folder_name+
" "
Python 程序,程序池
注意 程序池中的程序如果發生異常時,主程序中並不會得到異常提示。如果程序池中的程序要使用佇列 queue 實現程序間通訊,必須使用queue multiprocessing.manager queue 的方式建立佇列 需要先導入multiprocessing模組 demo.py 程序池 coding...
程序間SOCKET控制代碼傳遞 程序池應用
1。函式及結構介紹 開發通訊程式,經常遇到服務程式的開發,常見使用程序池及執行緒池,下面介紹一對在程序池應用非常有用的函式,sendmsg recvmsg,可以通過這組函式在程序中傳遞socket描述符。可以在主程序使用多路復用偵聽socket事件,將讀寫事件控制代碼傳遞給工作程序進行處理。在使用函...
執行緒程序 五 程序池
process target args start join p pool num 建立乙個包含有num個空閒程序的池子 建立大規模任務,pool 100 from mutliprocessing import pool process target,args lock p.close p.join...