摘要:分布式進程在和中,應當優選,因為更穩定,而且,可以分布到多臺機器上,而最多只能分布到同一臺機器的多個上。由于模塊封裝很好,不必了解網絡通信的細節,就可以很容易地編寫分布式多進程程序。
分布式進程
在Thread和Process中,應當優選Process,因為Process更穩定,而且,Process可以分布到多臺機器上,而Thread最多只能分布到同一臺機器的多個CPU上。
Python的 multiprocessing 模塊不但支持多進程, 其中 managers 子模塊還支持把多進程分布到多臺機器上。一個服務進程可以作為調度者,將任務分布到其他多個進程中,依靠網絡通信。由于managers模塊封裝很好,不必了解網絡通信的細節,就可以很容易地編寫分布式多進程程序。
通過managers模塊把Queue通過網絡暴露出去,就可以讓其他機器的進程訪問Queue了。先看服務進程,服務進程負責啟動Queue,把Queue注冊到網絡上,然后往Queue里面寫入任務。
BaseManager: 提供了不同機器進程之間共享數據的一種方法;
(重要的點: ip:port)
# task_master.py import random from multiprocessing import freeze_support from queue import Queue from multiprocessing.managers import BaseManager # 1. 創建需要的隊列 # task_queue:發送任務的隊列 # coding=utf-8 import random,time from queue import Queue from multiprocessing.managers import BaseManager from multiprocessing import freeze_support task_queue = Queue() # 發送任務的隊列: result_queue = Queue() # 接收結果的隊列: class QueueManager(BaseManager): # 從BaseManager繼承的QueueManager: pass # windows下運行 def return_task_queue(): global task_queue return task_queue # 返回發送任務隊列 def return_result_queue (): global result_queue return result_queue # 返回接收結果隊列 def test(): # 把兩個Queue都注冊到網絡上, callable參數關聯了Queue對象,它們用來進行進程間通信,交換對象 #QueueManager.register("get_task_queue", callable=lambda: task_queue) #QueueManager.register("get_result_queue", callable=lambda: result_queue) QueueManager.register("get_task_queue", callable=return_task_queue) QueueManager.register("get_result_queue", callable=return_result_queue) # 綁定端口4000, 設置驗證碼"sheenstar": #manager = QueueManager(address=("", 4000), authkey=b"sheenstar") # windows需要寫ip地址 manager = QueueManager(address=("192.168.1.160", 4000), authkey=b"sheenstar") manager.start() # 啟動Queue: # 獲得通過網絡訪問的Queue對象: task = manager.get_task_queue() result = manager.get_result_queue() for i in range(13): # 放幾個任務進去: n = random.randint(0, 10000) print("Put task %d..." % n) task.put(n) # 從result隊列讀取結果: print("Try get results...") for i in range(13): r = result.get(timeout=10) print("Result: %s" % r) # 關閉: manager.shutdown() print("master exit.") if __name__=="__main__": freeze_support() print("start!") test()
運行程序,會等待執行結果10s,如果沒有worker端獲取任務,返回結果,程序將報錯。
當我們在一臺機器上寫多進程程序時,創建的 Queue 可以直接拿來用,但是,在分布式多進程環境下,添加任務到Queue不可以直接對原始的 task_queue 進行操作,那樣就繞過了QueueManager 的封裝,必須通過manager.get_task_queue()獲得的 Queue 接口添加。
# coding=utf-8 import time, sys from queue import Queue from multiprocessing.managers import BaseManager # 創建類似的QueueManager: class QueueManager(BaseManager): pass # 由于這個QueueManager只從網絡上獲取Queue,所以注冊時只提供名字: QueueManager.register("get_task_queue") QueueManager.register("get_result_queue") # 連接到服務器,也就是運行task_master.py的機器: server_addr = "192.168.1.160" print("Connect to server %s..." % server_addr) # 端口和驗證碼注意保持與task_master.py設置的完全一致: m = QueueManager(address=(server_addr, 4000), authkey=b"sheenstar") # 從網絡連接: try: m.connect() except: print("請先啟動task_master.py!") #sys.exit("sorry, goodbye!"); # 獲取Queue的對象: task = m.get_task_queue() result = m.get_result_queue() # 從task隊列取任務,并把結果寫入result隊列: for i in range(13): try: n = task.get() print("run task %d * %d..." % (n, n)) r = "%d * %d = %d" % (n, n, n*n) time.sleep(1) result.put(r) except ConnectionResetError as e: print("任務執行結束,自動斷開連接") # 處理結束: print("worker exit.")
使用命令行運行程序,結果更直觀
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42481.html
摘要:在一個進程內部,要同時干多件事,就需要同時運行多個子任務,我們把進程內的這些子任務稱為線程。總結一下,多任務的實現方式有三種多進程模式多線程模式多進程多線程模式線程是最小的執行單元,而進程由至少一個線程組成。 進程與線程 很多同學都聽說過,現代操作系統比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務的操作系統。 什么叫多任務呢?簡單地說,就是操作系統可以同時...
摘要:協程實現連接在網絡通信中,每個連接都必須創建新線程或進程來處理,否則,單線程在處理連接的過程中,無法接受其他客戶端的連接。所以我們嘗試使用協程來實現服務器對多個客戶端的響應。 協程實現TCP連接 在網絡通信中,每個連接都必須創建新線程(或進程) 來處理,否則,單線程在處理連接的過程中, 無法接受其他客戶端的連接。所以我們嘗試使用協程來實現服務器對多個客戶端的響應。與單一TCP通信的構架...
摘要:多進程執行任務結束,創建進程和銷毀進程是時間的,如果長度不夠,會造成多線程快過多進程多線程執行任務結束,進程間通信生產者消費者模型與隊列演示了生產者和消費者的場景。 進程 Python是運行在解釋器中的語言,查找資料知道,python中有一個全局鎖(GIL),在使用多進程(Thread)的情況下,不能發揮多核的優勢。而使用多進程(Multiprocess),則可以發揮多核的優勢真正地提...
摘要:一個包來了之后,到底是交給瀏覽器還是,就需要端口號來區分。每個網絡程序都向操作系統申請唯一的端口號,這樣,兩個進程在兩臺計算機之間建立網絡連接就需要各自的地址和各自的端口號。 網絡通信的三要素 IP 通信的時候, 雙方必須知道對方的標識, 好比發郵件必須知道對方的郵件地址。 互聯網上每個計算機的唯一標識就是IP地址, 類似 123.123.123.123 。 IP地址實際上是一個32位...
摘要:我們來編寫一個簡單的服務器程序,它接收客戶端連接,回復客戶端發來的請求。如果一切順利,新浪的服務器接受了我們的連接,一個連接就建立起來的,后面的通信就是發送網頁內容了。 TCP TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義。在簡化的計算機網絡OSI模型中,它完成第四...
閱讀 3189·2021-11-24 10:30
閱讀 1313·2021-09-30 09:56
閱讀 2385·2021-09-07 10:20
閱讀 2597·2021-08-27 13:10
閱讀 698·2019-08-30 11:11
閱讀 2051·2019-08-29 12:13
閱讀 758·2019-08-26 12:24
閱讀 2897·2019-08-26 12:20