python分散式程序模型
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() 方法用於