標籤:
抽了點時間體驗了一把python 分布式進程,有點像分散式運算的意思,不過我現在還沒有這個需求,先把簡單體驗的指令碼發出來,供路過的各位高手指教註:需要先下載multiprocessing 的python包支援才行。管理端:cat task_manager.py #!/usr/bin/env python#coding:utf8import random,time,Queue,jsonfrom multiprocessing.managers import BaseManager#發送任務的隊列:task_queue = Queue.Queue()#接收結果的隊列:result_queue = Queue.Queue()#從BaseManager 繼承的QueueManager:class QueueManager(BaseManager): pass#把兩個Queue 都注岫到網路上,callable 參數關聯了Queue對象:QueueManager.register(‘get_task_queue‘,callable=lambda:task_queue)QueueManager.register(‘get_result_queue‘,callable=lambda:result_queue)#綁定連接埠5000 設定驗證碼‘123456‘manager = QueueManager(address=(‘‘,5000),authkey=‘123456‘)#啟動Queue:manager.start()#獲得通過網路訪問的Queue對象:task = manager.get_task_queue()result = manager.get_result_queue()#放任務進去:print ‘put tasks ........‘shell_cmd = [‘date‘,‘hostname‘,‘uptime‘]print ‘Put task \033[1;31;2m [%s] \033[0m..‘ %shell_cmdwhile True: print ‘get result.....‘ task.put(shell_cmd) r = result.get() print ‘Result:\033[1;32;40m %s \033[0m...‘ %r manager.shutdown()用戶端:#!/usr/bin/env python#coding:utf8import time,sys,Queue,os,commandsfrom multiprocessing.managers import BaseManager#建立類似的QueueManager:class QueueManager(BaseManager): pass#由於這個queuemanager 只從網路上擷取queue,所以註冊時只提供名字:QueueManager.register(‘get_task_queue‘)QueueManager.register(‘get_result_queue‘)#串連到伺服器 也就是迍務器server_addr = ‘10.1.10.15‘print ‘Connect to server %s...‘ %server_addr#連接埠和驗證碼注意保持與taskmanager.py的一致m = QueueManager(address=(server_addr,5000),authkey=‘123456‘)#從網路連接m.connect()#擷取Queue的對象task = m.get_task_queue()result = m.get_result_queue()#從task隊列取作務,並把結果寫處result隊列n = task.get(timeout=1)print n,type(n)s,v =commands.getstatusoutput("ifconfig | grep ‘inet addr:‘| grep -v ‘127.0.0.1‘ | cut -d: -f2 | awk ‘{ print $1}‘")r_dic = {v:[]}for i in n: print ‘run task \033[1;36;40m %s \033[0m‘ %i r = os.popen(i).read().split(‘\n‘)[:-1] r_dic[v].append(r) time.sleep(1)result.put(r_dic)print r_dic#處理結束:print ‘worker exit.‘
python 分布式進程體驗