練習1: 求100000以內質數之和
分別使用4個程序和10個程序做這件事,並且分別
統計執行時間,進行對比
import time
from multiprocessing import process
def timeis
(f):
(*args,
**kwargs)
: start_time = time.
time()
res =f(
*args,
**kwargs)
end_time = time.
time()
print
("%s執行時間%.6f"
%(f.__name__,end_time-start_time)
)return res
# 判斷乙個數是否為質數
def isprime
(n):
if n <=1:
return false
for i in range(2
,n):
if n % i ==0:
return false
return true
# 設定單程序
@timeis
def no_multi_process()
: prime =
for i in range(1
,100001):
ifisprime
(i):
prime.
(i)sum
(prime)
class prime
(process)
: def __init__
(self,prime,begin,end)
:super()
.__init__()
self.prime = prime # 裝質數的列表
self.begin = begin # 開始數值
self.end = end # 結束數值
def run
(self)
:for i in range
(self.begin,self.end):if
isprime
(i):
self.prime.
(i)sum
(self.prime)
# 設定4個程序
@timeis
def use_4_process()
: prime =
jobs =
for i in range(1
,100001
,25000):
p =prime
(prime,i,i+
25000
) jobs.
(p) p.
start()
[i.join()
for i in jobs]
# 設定10個程序
@timeis
def use_10_process()
: prime =
jobs =
for i in range(1
,100001
,10000):
p =prime
(prime,i,i+
10000
) jobs.
(p) p.
start()
[i.join()
for i in jobs]
if __name__ ==
'__main__'
:# no_multi_process執行時間26.246834
# no_multi_process()
# use_4_process執行時間14.909750
# use_4_process()
# use_10_process執行時間13.656211
use_10_process
()
至少同時拷貝4個檔案,並且僅能建立4個程序
拷貝過程中實時列印拷貝的百分比
from multiprocessing import pool,queue
import os
q =queue
() # 訊息佇列
# 拷貝乙個檔案,作為程序池事件
# 拷貝啥,從哪拷,拷到哪?
def copy_file
(file,old_dir,new_dir)
: fr =
open
(old_dir+
'/'+file,
'rb'
) fw =
open
(new_dir+
'/'+file,
'wb'
)while true:
data = fr.
read
(1024*10
)if not data:
break
n = fw.
write
(data)
q.put(n) # 位元組數傳入訊息佇列
fr.close()
fw.close()
def main()
:"""
建立程序池,呼叫拷貝檔案的函式作為事件
"""base_path =
"/home/tarena/" #基準目錄
dir =
input
("dir:"
) #要備份的目錄
old_dir = base_path + dir # 要備份目錄路徑
new_dir = old_dir+
'-備份' # 拷到這
os.mkdir
(new_dir)
file_list = os.
listdir
(old_dir) #拷這些
# 獲取目錄的總大小
total_size =
0for i in file_list:
total_size +
= os.path.
getsize
(old_dir+
'/'+i)
# 建立程序池
pool =
pool(4
)for file in file_list:
pool.
(copy_file,
args=
(file,old_dir,new_dir)
) pool.
close()
print
("目錄大小:%.2fm"
%(total_size/
1024
/1024))
copy_size =
0 # 已經拷貝了的大小
while copy_size < total_size:
copy_size +
= q.
get(
)print
("拷貝了%.1f%%"
%(copy_size/total_size*
100)
) pool.
join()
if __name__ ==
'__main__'
:main
()
注:設定多個程序並不一定會成倍的提高執行效率,需要看主機配置幾核的處理器 Python兩個程序溝通問題
在父程序中建立兩個子程序,乙個往queue寫資料,乙個從queue讀資料,用同乙個訊息佇列 frommultiprocessingimportqueue,process importtime,random defwrite q forvaluein a b c d print write put s...
python多程序的坑 Python多程序相關的坑
python的multiprocessing模組實現了多程序功能,但官方文件上只有一些比較簡單的用法,主要是使用函式作為process的target,而如何在class中使用多程序並沒有多講解。google出兩篇比較詳細的文章,建議從它們入門 下面記錄一下自己這週在python多程序上碰到的坑 建立...
Python多程序1 乙個多程序例項
學習 分類目錄 多程序 多程序與多執行緒類似,無論是在理論還是操作上,我在這裡就多執行緒寫了一點東西。多程序與多執行緒最大的區別是,多程序是真正意義上的 物理層面上的並行執行,每個程序會被分配到足夠的 在實際有那麼多的前提下 資源單獨進行運算。而多執行緒則是多個程序間共享資源,通過分時獲得資源的一種...