展开全部
多进程间共享的变量要使用特殊的数据结构,在multiprocessing包里有提供,常用的有Queue, Value, Array等,这里比较适合用Queue
修改62616964757a686964616fe58685e5aeb931333337613764后的程序如下,注意Result赋值,和ProcessCheck的参数
另外,Result要排序后输出的话,要用循环从Queue取值构建list再排序,这里省略了import datetime
import sys
import time
import multiprocessing
PartStart = [] #每个process计算的起点
PartEnd = [] #每个process计算的终点
Result = multiprocessing.Queue() #所有结果存储在Result数组中
ProcessCount = 10 #进程数
EndNum = 9999999 #计算范围,默认100开始,终止数可以任意修改,大于100即可
print('Start:%s' %datetime.datetime.now().strftime("%Y/%d/%m %H:%M:%S"))
start=time.time()
d=int(((EndNum-99)/ProcessCount)+0.5)
for i in range(ProcessCount):
PartStart.append(100+i*d)
PartEnd.append(PartStart[i]+d-1)
PartEnd[ProcessCount-1]=EndNum
#==========================================
#这段代码只是计算每个process的计算起点和终点
def CheckNum(Number):
tmp=str(Number)
len_num=len(tmp)
sum_num = 0
for i in range(len_num):
sum_num=sum_num+(int(tmp[i])**len_num)
if sum_num==int(Number):
return True
#print(Number,"是水仙花数")
else:
return False
#print(Number,"不是水仙花数")
def ProcessCheck(Start,End, Result):
for j in range(int(Start),int(End)+1):
if CheckNum(j):
#print(j,"是水仙花数")
print("hello world")
Result.put(str(j)+"是水仙花数")
#============================================
#这段代码用于计算某数值区间内的水仙花数,并存储进result数组中,也是每个process运行的代码
def main():
threads=[]
for i in range(ProcessCount):
p=multiprocessing.Process(target=ProcessCheck, args=(PartStart[i],PartEnd[i], Result))
threads.append(p)
for i in range(ProcessCount):
threads[i].start()
for i in range(ProcessCount):
threads[i].join()
#Result.sort(key=lambda t:t[0])
for i in range(Result.qsize()):
print(Result.get())
#将最后的结果排序输出,但没有任何结果出现
end = time.time()
input('End:%s' %datetime.datetime.now().strftime("%Y/%d/%m %H:%M:%S")+"\n"+"共耗时:"+str(end-start))
#这个input没有任何意义,主要是防止程序直接结束退出
if __name__ == '__main__':
main()