1、使用多线程和多进程执行一个CPU密集型任务
水仙花数介绍:
水仙花数就是将一个数的个位、十位、百位,拆分出来。 然后将各个位的3次方相加,结果与数字本身相同的就是水仙花数。
对比多进程和多线程在执行“水仙花算法”的效率,代码如下:
# _*_ encoding:utf-8 _*_
from threading import Thread
from multiprocessing import Process
def is_armstrong(n):
# 判断是不是"水仙花数"
"""
水仙花数就是将一个数的个位、十位、百位,拆分出来。
然后将各个位的3次方相加,结果与数字本身相同的就是水仙花数。
"""
a, t = [], n
while t > 0:
a.append(t % 10)
t //= 10
k = len(a)
return sum(x ** k for x in a) == n
def find_armstrong(a, b):
# 在某一范围内查找所有的"水仙花数"
print(a, b)
res = [k for k in range(a, b) if is_armstrong(k)]
print('%s ~ %s: %s' % (a, b, res))
def find_by_thread(*args_list):
# 查找水仙花线程函数
workers = []
for args in args_list:
worker = Thread(target=find_armstrong, args=args)
workers.append(worker)
worker.start()
for worker in workers:
worker.join()
def find_by_process(*args_list):
# 查找水仙花进程函数
workers = []
for args in args_list:
worker = Process(target=find_armstrong, args=args)
workers.append(worker)
worker.start()
for worker in workers:
worker.join()
if __name__ == '__main__':
import time
# 查看多进程和多线程执行CPU密集型程序,比较时间消耗
start = time.time()
# find_by_process((20000000, 25000000), (25000000, 30000000))
find_by_thread((20000000, 25000000), (25000000, 30000000))
print(time.time() - start)
'''
多进程耗时时间:19.72704315185547
多线程程耗时时间:39.088863134384155
'''