首頁  >  文章  >  後端開發  >  什麼是python分散式進程? (實例解析)

什麼是python分散式進程? (實例解析)

乌拉乌拉~
乌拉乌拉~原創
2018-08-23 17:42:292442瀏覽

在這篇文章之中我們來了解什麼是python分散式進程。了解python分散式進程的相關知識,以及分散式進程在python程式設計之中能起到什麼樣的作用。

在Thread和Process中,應優選Process,因為Process更穩定,而且,Process可以分散到多台機器上,而Thread最多只能分散到同一台機器的多個CPU上。

Python的multiprocessing模組不但支援多進程,其中managers子模組還支援把多進程分佈到多台機器上。一個服務進程可以作為調度者,將任務分佈到其他多個進程中,並依靠網路通訊。由於managers模組封裝很好,不必了解網路通訊的細節,就可以輕鬆地編寫分散式多進程程式。

舉個例子:如果我們已經有一個透過Queue通訊的多進程程式在同一台機器上運行,現在,由於處理任務的進程任務繁重,希望把發送任務的進程和處理任務的進程分佈到兩台機器上。怎麼用分散式進程實現?

原有的Queue可以繼續使用,但是,透過managers模組把Queue透過網路暴露出去,就可以讓其他機器的進程存取Queue了。

我們先看服務進程,服務進程負責啟動Queue,把Queue註冊到網路上,然後往Queue裡面寫入任務:

# task_master.py

import random, time, queue
from 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, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')
# 启动Queue:
manager.start()
# 获得通过网络访问的Queue对象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放几个任务进去:
for i in range(10):
    n = random.randint(0, 10000)
    print('Put task %d...' % n)
    task.put(n)
# 从result队列读取结果:
print('Try get results...')
for i in range(10):
    r = result.get(timeout=10)
    print('Result: %s' % r)
# 关闭:
manager.shutdown()

請注意,當我們在一台機器上寫多進程程式時,建立的Queue可以直接拿來用,但是,在分散式多進程環境下,新增任務到Queue不可以直接對原始的task_queue進行操作,那樣就繞過了QueueManager的封裝,必須透過manager.get_task_queue()所獲得的Queue介面新增。

然後,在另一台機器上啟動任務進程(本機上啟動也可以):

# task_master.py
import random, time, queue
from 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, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')
# 启动Queue:
manager.start()
# 获得通过网络访问的Queue对象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放几个任务进去:
for i in range(10):
    n = random.randint(0, 10000)
    print('Put task %d...' % n)
    task.put(n)
# 从result队列读取结果:
print('Try get results...')
for i in range(10):
    r = result.get(timeout=10)
    print('Result: %s' % r)
# 关闭:
manager.shutdown()

任務進程要透過網路連接到服務進程,所以要指定服務進程的IP 。

現在,可以試試分散式流程的工作效果了。先啟動task_master.py服務程序:

$ python3 task_master.py 
Put task 3411...
Put task 1605...
Put task 1398...
Put task 4729...
Put task 5300...
Put task 7471...
Put task 68...
Put task 4219...
Put task 339...
Put task 7866...
Try get results...

task_master.py程序傳送完任務後,開始等待result佇列的結果。現在啟動task_worker.py進程:

$ python3 task_worker.pyConnect to server 127.0.0.1...
run task 3411 * 3411...
run task 1605 * 1605...
run task 1398 * 1398...
run task 4729 * 4729...
run task 5300 * 5300...
run task 7471 * 7471...
run task 68 * 68...
run task 4219 * 4219...
run task 339 * 339...
run task 7866 * 7866...
worker exit.

task_worker.py進程結束,在task_master.py進程中會繼續印出結果:

Result: 3411 * 3411 = 11634921
Result: 1605 * 1605 = 2576025
Result: 1398 * 1398 = 1954404
Result: 4729 * 4729 = 22363441
Result: 5300 * 5300 = 28090000
Result: 7471 * 7471 = 55815841
Result: 68 * 68 = 4624
Result: 4219 * 4219 = 17799961
Result: 339 * 339 = 114921
Result: 7866 * 7866 = 61873956

這個簡單的Master/Worker模型有什麼用?其實這就是一個簡單但真正的分散式計算,把程式碼稍加改造,啟動多個worker,就可以把任務分佈到幾台甚至幾十台機器上,例如把計算n*n的程式碼換成發送郵件,就實現了郵件佇列的非同步發送。

而Queue之所以能透過網路訪問,就是透過QueueManager實現的。由於QueueManager管理的不只一個Queue,所以,要為每個Queue的網路呼叫介面取個名字,例如get_task_queue。

authkey有什麼用?這是為了確保兩台機器正常通信,不被其他機器惡意幹擾。如果task_worker.py的authkey和task_master.py的authkey不一致,肯定連接不上。

Python的分散式進程介面簡單,封裝良好,適合需要把繁重任務分佈到多台機器的環境下。

注意Queue的作用是用來傳遞任務和接收結果,每個任務的描述資料量要盡量小。例如發送一個處理日誌檔案的任務,就不要發送幾百兆的日誌檔案本身,而是發送日誌檔案存放的完整路徑,由Worker進程再去共享的磁碟上讀取檔案。

以上就是本篇文章所講述的所有內容,這篇文章主要介紹了python分散式流程的相關知識,希望你能藉助資料從而理解上述所說的內容。希望我在這片文章所講述的內容能夠對你有幫助,讓你學習python更加輕鬆。

更多相關知識,請造訪php中文網Python教學欄位。

以上是什麼是python分散式進程? (實例解析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn