Python使用多进程来并行运算 2021-08-21
汉诺塔
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
用递归的思路来模拟
n层的汉诺塔要从x杆移动到z杆,每一次只能移动一层,而且小的层只能放在大的层上面 只有一层时,将这一层从x移动到z 超过1层时,先将n-1层移动到y杆,再将第n层移动到z杆,最后将n-1层移动到z杆
Python代码
单纯地模拟n层很容易,但如果要看每多一层其运行难度的变化使用for循环遍历n层则只能使用单线程进行运算,非常耗费时间。Python有提供多线程进行运算,但实际上还是只能使用CPU的一个核心进行运算,效率不高。所以需要使用到Python的多进程
使用多进程需要先导入多进程模块
import multiprocessing
通过继承多进程类来创建类
class myThread(multiprocessing.Process):
def __init__(self, n, x, y, z):
multiprocessing.Process.__init__(self)
self.n = n
self.x = x
self.y = y
self.z = z
重定义run函数,将需要运行的函数封装进去
def run(self):
start = time.time()
print("开始线程:", self.n)
hanoi(self.n, self.x, self.y, self.z) #封装的汉诺塔函数
end = time.time()
time_run = end - start
print(f结束线程:{
self.n},{
self.n}层汉诺塔运行时间是{
time_run}s)
最后创建类并调用start函数就可以了
thread_1 = myThread(j, x, y, z) thread_1.start()
整体的代码如下,可以试试运行哦,将cpu吃满
import multiprocessing
import sys
import time
def hanoi(n, x, y, z):
if n == 1:
# print(x,——>,z)
pass
else:
hanoi(n - 1, x, z, y)
# print(x,——>,z)
hanoi(n - 1, y, x, z)
class myThread(multiprocessing.Process):
def __init__(self, n, x, y, z):
multiprocessing.Process.__init__(self)
self.n = n
self.x = x
self.y = y
self.z = z
def run(self):
start = time.time()
print("开始线程:", self.n)
hanoi(self.n, self.x, self.y, self.z)
end = time.time()
time_run = end - start
print(f结束线程:{
self.n},{
self.n}层汉诺塔运行时间是{
time_run}s)
sys.setrecursionlimit(10000)
thread = dict()
if __name__ == __main__:
for j in range(1, 50):
thread[j] = myThread(j, x, y, z)
for i in range(25, 50):
thread[i].start()
