程序池,程序的應用

2021-10-24 05:43:29 字數 3043 閱讀 2650

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...