最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python分布式編程實現(xiàn)過程解析

 更新時間:2019年11月08日 15:43:14   作者:Mars.wang  
這篇文章主要介紹了python分布式編程實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

分布式編程的難點在于:

1.服務(wù)器之間的通信,主節(jié)點如何了解從節(jié)點的執(zhí)行進度,并在從節(jié)點之間進行負載均衡和任務(wù)調(diào)度;

2.如何讓多個服務(wù)器上的進程訪問同一資源的不同部分進行執(zhí)行

第一部分涉及到網(wǎng)絡(luò)編程的底層細節(jié)

第二個問題讓我聯(lián)想到hdfs的一些功能。

首先分布式進程還是解決的是單機單進程無法處理的大數(shù)據(jù)量大計算量的問題,希望能加通過一份代碼(最多主+從兩份)來并行執(zhí)行一個大任務(wù)。

這就面臨兩個問題,首先將程序分布到多臺服務(wù)器,其次將輸入數(shù)據(jù)分配給多臺服務(wù)器。

第一個問題相對比較簡單,畢竟程序一般不會太長,即便是超級jar包的spark程序,也不過百兆。

但數(shù)據(jù)里不同,如今企業(yè)級別的數(shù)據(jù)動輒GB、TB,如果在分布式程序執(zhí)行之前首先要進行大容量數(shù)據(jù)的轉(zhuǎn)移,顯然是不可取的。

這時候我們就需要一個中央共享數(shù)據(jù)源,所有服務(wù)器都可以對這個數(shù)據(jù)源進行并行存取(塊block),這就已經(jīng)非常接近hdfs的功能。

因為在hdfs中,集群中的多臺服務(wù)器共享同一個hdfs,每臺機器訪問hdfs就像訪問本地數(shù)據(jù)一樣(還是稍微慢一點);

計算任務(wù)執(zhí)行完之后,每臺服務(wù)器還可以將自己的計算結(jié)果寫回hdfs,每臺服務(wù)器的結(jié)果被存儲成了結(jié)果目錄中的小文件。

# task_master.py

import random, time, queue
from multiprocessing.managers import BaseManager

# 發(fā)送任務(wù)的隊列:
task_queue = queue.Queue()
# 接收結(jié)果的隊列:
result_queue = queue.Queue()

# 從BaseManager繼承的QueueManager:
class QueueManager(BaseManager):
  pass

# 把兩個Queue都注冊到網(wǎng)絡(luò)上, callable參數(shù)關(guān)聯(lián)了Queue對象:
QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
# 綁定端口5000, 設(shè)置驗證碼'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')
# 啟動Queue:
manager.start()
# 獲得通過網(wǎng)絡(luò)訪問的Queue對象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放幾個任務(wù)進去:
for i in range(10):
  n = random.randint(0, 10000)
  print('Put task %d...' % n)
  task.put(n)
# 從result隊列讀取結(jié)果:
print('Try get results...')
for i in range(10):
  r = result.get(timeout=10)
  print('Result: %s' % r)
# 關(guān)閉:
manager.shutdown()
print('master exit.')
# task_worker.py

import time, sys, queue
from multiprocessing.managers import BaseManager

# 創(chuàng)建類似的QueueManager:
class QueueManager(BaseManager):
  pass

# 由于這個QueueManager只從網(wǎng)絡(luò)上獲取Queue,所以注冊時只提供名字:
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

# 連接到服務(wù)器,也就是運行task_master.py的機器:
server_addr = '127.0.0.1'
print('Connect to server %s...' % server_addr)
# 端口和驗證碼注意保持與task_master.py設(shè)置的完全一致:
m = QueueManager(address=(server_addr, 5000), authkey=b'abc')
# 從網(wǎng)絡(luò)連接:
m.connect()
# 獲取Queue的對象:
task = m.get_task_queue()
result = m.get_result_queue()
# 從task隊列取任務(wù),并把結(jié)果寫入result隊列:
for i in range(10):
  try:
    n = task.get(timeout=1)
    print('run task %d * %d...' % (n, n))
    r = '%d * %d = %d' % (n, n, n*n)
    time.sleep(1)
    result.put(r)
  except Queue.Empty:
    print('task queue is empty.')
# 處理結(jié)束:
print('worker exit.')

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

尼玛县| 万源市| 驻马店市| 简阳市| 开阳县| 革吉县| 东平县| 乐至县| 壶关县| 淄博市| 临澧县| 广河县| 龙州县| 丽水市| 肇庆市| 慈溪市| 和平区| 临武县| 黎城县| 洱源县| 山丹县| 青田县| 广平县| 岳西县| 渝北区| 卫辉市| 鄯善县| 江华| 佳木斯市| 扶风县| 突泉县| 青阳县| 酉阳| 玛纳斯县| 会宁县| 克什克腾旗| 德庆县| 旺苍县| 全椒县| 田东县| 达日县|