zl程序教程

您现在的位置是:首页 >  其它

当前栏目

简单搭建分布式计算

简单 搭建 分布式计算
2023-09-14 09:05:39 时间

#主机控制代码

import multiprocessing
import multiprocessing.managers
import random,time
from multiprocessing import Queue
# 任务队列
task_queue=Queue()
# 结果队列
result_queue=Queue()

# 提供给从机调用后得到队列中的数据
# 就是接口
def return_task():
	return task_queue
def return_result():
	return result_queue
class QueueManager(multiprocessing.managers.BaseManager):
	pass
if __name__=="__main__":
	# 开启分布式支持
	multiprocessing.freeze_support()
	# 注册可以访问队列并得到结果的函数
	QueueManager.register('get_task',callable=return_task)
	QueueManager.register('get_result',callable=return_result)
	manager=QueueManager(address=('192.168.72.135',8888),authkey='password'.encode('utf-8'))
	manager.start()
	task=manager.get_task()
	result=manager.get_result()
	for i in range(1000):
		print('task add data')
		#将任务放入队列
		task.put(i)
		print('watting for ____')
	for i in range(1000):
	       #将结果从队列中取出
		res=result.get()
		print('get_data',res)
	manager.shutdown()
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
×××××××××××××××××××××
import multiprocessing
import multiprocessing.managers
import random,time
from multiprocessing import Queue

class QueueManager(multiprocessing.managers.BaseManager):
	pass
if __name__=="__main__":
	# 开启分布式支持
	multiprocessing.freeze_support()
	# 注册可以访问队列并得到结果的函数
	QueueManager.register('get_task')
	QueueManager.register('get_result')
	manager=QueueManager(address=('192.168.72.135',8888),authkey='password'.encode('utf-8'))
	manager.connect()
	task=manager.get_task()
	result=manager.get_result()
	for i in range(1000):
		try:
		#从队列中取出任务
			data=task.get()
			print('client_get',data)
#处理计算任务将结果放入队列中			result.put('client'+str((data+10)))
		except:
			pass

上面是单一任务可开启多个从机来处理数据由于每个从机取出任务后该任务就会在队列中消失
所以每个任务只能给一个从机处理所以不会造成任务重复

另外还可以定义不同算法的从机,但在此时也因该定义不同算法的主机来控制接受数据
所以有一个命令主机程序负责控制不同算法队列 该任务队列是将控制不同算法的输入队列的开启和控制每个从机的不同算法的开启 在自己本地执行接到的某一算法处理程序

在这里插入图

控制程序和算法程序除了端口和加入队列的数据不同都是一样的
算法程序被控制程序启动 无论是主机上还是从机上
只不过是主机上是当控制程序的命令加入队列后就立即启动了所有加入队列被控制的算法程序
待每个从机从控制队列中拿到命令那个算法由自己执行后便开启了响应的算法
每个从机都有所有的算法处理程序无论是接到处理什么的任务都可以处理
且每个从机都拥有控制从机程序从控制队列中获取任务
每个算法程序独立一个端口独立一个队列对应一个独立的从机程序

队列的多样性使得 此方法 更加强大 能将多任务多机合作进行白百分百的发挥
效率一般高效