1. 程式人生 > >python分散式程序模型

python分散式程序模型

分散式程序:Process程序分佈到多臺機器上
Python的multiprocessing模組不但支援多程序,其中managers子模組還支援把多程序分佈到多臺機器上。

可以寫一個服務程序作為排程者,將任務分佈到其他多個程序中,依靠網路通訊進行管理。



另外值得注意的是,manager和worker兩端建立的例項是相關的,即worker的例項,通過驗證碼和網路IP地址連線到manager即伺服器的例項。

# -*- coding:utf-8 -*-

#taskmanager.py
'''
1.建立佇列,作為共享訊息的通道。 服務程序
任務佇列task_queue作為服務程序傳遞任務給任務程序的通道,而結果佇列result_queue作為任務程序完成任務後回傳給服務程序的通道。
值得注意的是,在【一臺機器上】寫多程序程式時,建立的Queue可以直接拿來用
然而,在分散式多程序環境下,不可以直接新增任務到原始的task_queue,那樣就繞過了Queuemanager的封裝,
必須通過manager.get_task_queue()獲得的【Queue介面】新增任務。
2.把1.中建立的佇列在網路上註冊,暴露給其他程序(主機),註冊後獲得【網路佇列】(可以認為是1.中佇列的'映像')
3.建立一個物件(Queuemanager(BaseManager))例項manager,繫結埠和驗證碼
4.啟動3.中建立的例項,以便監聽連線(啟動管理 manager,監管資訊通道)
5.通過管理例項的方法獲得通過網路訪問的Queue物件,即再把網路佇列實體化成可以使用的本地佇列(通過本地上傳到網路)
6.建立任務到“本地”佇列中,自動上傳任務到網路佇列中,以供分配給
'''

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

#建立兩個佇列,分別存放任務和結果,它們用來進行程序間通訊,交換物件。換言之,這兩個佇列就是交換物件
task_queue=Queue.Queue()
result_queue=Queue.Queue()

class Queuemanager(BaseManager):
	pass

#把建立的兩個佇列註冊在網路上,利用register方法,callable引數關聯了Queue物件
#typeid is a “type identifier”(型別識別符號) which is used to identify a particular type of shared object. This must be a string.
#callable is a callable used for creating objects for this type identifier.——後者用來建立前者,後者是具體的物件,而前者是利用後者創造出來的“影子”
Queuemanager.register('get_task_queue',callable=lambda:task_queue)
Queuemanager.register('get_result_queue',callable=lambda:result_queue)

#繫結埠5000,設定驗證碼‘abc’。這個相當於物件的初始化
#address is the address on which the manager process listens for new connections
manager=Queuemanager(address=('',5000),authkey='abc')

#啟動管理
manager.get_server().serve_forever()

#通過管理例項的方法獲得通過網路訪問的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)   #task是本地佇列

print 'try get result...'
for i in range(10):
	print 'result is %s' %result.get(timeout=10)
	
#關閉管理
manager.shutdown()


# taskworker.py

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

# 建立類似的QueueManager:
class QueueManager(BaseManager):
    pass

# 由於這個QueueManager只從網路上獲取Queue,所以註冊時只提供名字:
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

# 連線到伺服器,也就是執行taskmanager.py的機器:
server_addr = '127.0.0.1'
print('Connect to server %s...' % server_addr)
# 埠和驗證碼注意保持與taskmanager.py設定的完全一致:
m = QueueManager(address=(server_addr, 5000), authkey='abc')
# 從網路連線:
m.connect()
# 獲取Queue的物件:
task = m.get_task_queue()
result = m.get_result_queue()
# 從task佇列取任務,並把結果寫入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.')
# 處理結束:
print('worker exit.')

參考文件:https://docs.python.org/2/library/multiprocessing.html?highlight=basemanager#multiprocessing.sharedctypes.multiprocessing.Manager

相關推薦

python分散式程序模型

分散式程序:Process程序分佈到多臺機器上 Python的multiprocessing模組不但支援多程序,其中managers子模組還支援把多程序分佈到多臺機器上。可以寫一個服務程序作為排程者,將任務分佈到其他多個程序中,依靠網路通訊進行管理。 另外值得注意的是,

Python分散式程序中你會遇到的坑

關於博主 努力與運動兼備~~~有任何問題可以加我好友或者關注微信公眾號,歡迎交流,我們一起進步! 微信公眾號: 啃餅思錄

python分散式程序

  轉自廖雪峰的python教程,因為是在windows上程式設計,所以程式碼會和原文有一些出入。 master.py from multiprocessing.managers import BaseManager import random, time, queue ta

python分散式程序管理

對分散式程序管理的理解 把多程序分佈到多臺機器上,一個服務程序可以作為排程者,依靠網路通訊將任務將分配到多個程序中,如果有一個通過Queue通訊的多程序程式,將傳送任務的程序和處理任務的程序分佈到兩臺不同的主機上,原有的queue可以繼續使用,單是通過manag

Python分散式程序報錯:pickle模組不能序列化lambda函式

今天在學習到廖老師Python教程的分散式程序時,遇到了一個錯誤:_pickle.PicklingError: Can't pickle <function <lambda> at 0x000001710FDC2EA0>: attribute lo

python分散式程序Queue通訊

說明:本篇部落格來源於廖雪峰教程 在多程序和多執行緒程式設計中,因為程序更加穩定,且可以分佈到多臺機器上,而執行緒最多隻能分佈到一臺機器的不同cpu上,所以優選程序 Python的multiprocessing模組不但支援多程序,其中managers子模組還

Python基礎-分散式程序 Master/Worker模型

分散式程序 Python的multiprocessing模組不但支援多程序,其中的managers子模組還支援吧多程序分佈到多臺機器上。 Demo 執行示例 服務端 #!/usr/bin/env python3 # -*- coding

python大佬養成計劃----分散式程序

分散式程序 在Thread和Process中,應當優選Process,因為Process更穩定,而且,Process可以分佈到多臺機器上,而Thread最多隻能分佈到同一臺機器的多個CPU上。 Python的 multiprocessing 模組不但支援多程序, 其

python 實現分散式程序

前言 本來在學習廖雪峰老師的分散式程序模組,但是使用其程式碼執行,發現了各種報錯,通過自己的解決能順利跑通,現跟大家分享一下。 本文是通過學習廖雪峰老師的教程進行的記錄,僅用於個人學習記錄,請大家支援原創。 作業系統 由於目前僅試驗了windows系統下的開發

python每日一題:分散式程序之坑點

1.看{python爬蟲開發與專案實戰}中關於分散式程序,一直卡在這個知識點,書中的這個例子描述是在不同電腦上進行執行的,但這裡有一個前提:兩臺電腦的網段需相同,所以,程式設計練習時,對著兩臺電腦一直找問題,始終沒解決。 2.書中關於ip地址是127.0.0.1,這個地址是迴環地址,在同一臺機器上,開兩個c

python 學習 -- 分散式程序

伺服器端:import random,time,queue from multiprocessing.managers import BaseManager # 傳送任務的佇列 task_queue = queue.Queue() # 接收結果的佇列 result_qu

Python筆記——分散式程序

在Thread和Process中,應當優選Process,因為Process更穩定,而且,Process可以分佈到多臺機器上,而Thread最多隻能分佈到同一臺機器的多個CPU上。 Python的multiprocessing模組不但支援多程序,其中managers子模組還

生產者消費者模型-python-多程序

最近用python寫了一個base64解碼程式,解碼的過程比較耗CPU,為了充分發揮多核優勢,引入多執行緒,又因為python有全域性鎖GIL,多執行緒仍然只能使用一個核,於是重新用多程序multiprocessing實現。多執行緒下,通過繼承threading.Threa

Python multiprocessing 使用手記[1] – 程序模型

原文: 首先從multiprocessing的程序模型開始看。 multiprocessing的目的是建立一個介面和python.threading 類似介面的庫,用多程序的方式來併發處理。因此建立一個新的程序的的方法也 和python.threading很像: imp

Python程序-微信AI自動回復

ges images 微信 ccf try 消息 .post style register 一簡介   使用itcha實現微信登錄及消息發送接收,使用圖靈AI實現智能回復。 參考API: http://www.tuling123.com/ https://itchat.re

python-TCP傳輸模型

put pri accep code bsp input col size end 1 #!/usr/bin/python 2 #coding=utf-8 3 #服務器端 4 from socket import * 5 from time import cti

python 獲取程序退出狀態碼

pythonimport systry: sys.exit(1)except SystemExit,e: print e1python 獲取程序退出狀態碼

Python 新建程序

logs 配置 png com 分享 技術分享 .com nbsp images 1.建立一個新的文件夾 2.建一個包 3.建一個程序項目 4.默認模板配置 Python 新建程序

python-day38--IO模型

選擇 阻塞 技術 線程與進程 play 好的 輪詢 平臺 機制 一、 IO模型介紹 對於一個網絡通信,IO涉及到兩個階段   1.操作系統等數據來   2.進程或線程等操作系統拷貝數據 記住這兩點很重要,因為這些IO模型的區別就是在兩個階段上各有不同的情況。 二、阻塞IO(

python程序(模擬用戶登陸系統)

賬號 this src 使用 div [0 please one str 模擬登陸1.用戶輸入賬號密碼進行登陸2.用戶信息存在文件內3.用戶密碼輸錯三次後鎖定用戶 知識點:strip()、split()、while、for循環混用以及布爾值的使用 strip() 方法用於