成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python大佬養(yǎng)成計(jì)劃----分布式進(jìn)程

honmaple / 1079人閱讀

摘要:分布式進(jìn)程在和中,應(yīng)當(dāng)優(yōu)選,因?yàn)楦€(wěn)定,而且,可以分布到多臺(tái)機(jī)器上,而最多只能分布到同一臺(tái)機(jī)器的多個(gè)上。由于模塊封裝很好,不必了解網(wǎng)絡(luò)通信的細(xì)節(jié),就可以很容易地編寫(xiě)分布式多進(jìn)程程序。

分布式進(jìn)程

在Thread和Process中,應(yīng)當(dāng)優(yōu)選Process,因?yàn)镻rocess更穩(wěn)定,而且,Process可以分布到多臺(tái)機(jī)器上,而Thread最多只能分布到同一臺(tái)機(jī)器的多個(gè)CPU上。

Python的 multiprocessing 模塊不但支持多進(jìn)程, 其中 managers 子模塊還支持把多進(jìn)程分布到多臺(tái)機(jī)器上。一個(gè)服務(wù)進(jìn)程可以作為調(diào)度者,將任務(wù)分布到其他多個(gè)進(jìn)程中,依靠網(wǎng)絡(luò)通信。由于managers模塊封裝很好,不必了解網(wǎng)絡(luò)通信的細(xì)節(jié),就可以很容易地編寫(xiě)分布式多進(jìn)程程序。

通過(guò)managers模塊把Queue通過(guò)網(wǎng)絡(luò)暴露出去,就可以讓其他機(jī)器的進(jìn)程訪問(wèn)Queue了。先看服務(wù)進(jìn)程,服務(wù)進(jìn)程負(fù)責(zé)啟動(dòng)Queue,把Queue注冊(cè)到網(wǎng)絡(luò)上,然后往Queue里面寫(xiě)入任務(wù)。

BaseManager: 提供了不同機(jī)器進(jìn)程之間共享數(shù)據(jù)的一種方法;

(重要的點(diǎn): ip:port)
# task_master.py

import random
from multiprocessing import freeze_support
from queue import Queue
from multiprocessing.managers import  BaseManager
# 1. 創(chuàng)建需要的隊(duì)列
# task_queue:發(fā)送任務(wù)的隊(duì)列
# coding=utf-8

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

task_queue =  Queue()  # 發(fā)送任務(wù)的隊(duì)列:
result_queue = Queue() # 接收結(jié)果的隊(duì)列:
class QueueManager(BaseManager):  # 從BaseManager繼承的QueueManager:
    pass
# windows下運(yùn)行
def return_task_queue():
    global task_queue
    return task_queue  # 返回發(fā)送任務(wù)隊(duì)列
def return_result_queue ():
    global result_queue
    return result_queue # 返回接收結(jié)果隊(duì)列

def test():
    # 把兩個(gè)Queue都注冊(cè)到網(wǎng)絡(luò)上, callable參數(shù)關(guān)聯(lián)了Queue對(duì)象,它們用來(lái)進(jìn)行進(jìn)程間通信,交換對(duì)象
    #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, 設(shè)置驗(yàn)證碼"sheenstar":
    #manager = QueueManager(address=("", 4000), authkey=b"sheenstar")
    # windows需要寫(xiě)ip地址
    manager = QueueManager(address=("192.168.1.160", 4000), authkey=b"sheenstar")
    manager.start()  # 啟動(dòng)Queue:
    # 獲得通過(guò)網(wǎng)絡(luò)訪問(wèn)的Queue對(duì)象:
    task = manager.get_task_queue()
    result = manager.get_result_queue()
    for i in range(13):   # 放幾個(gè)任務(wù)進(jìn)去:
        n = random.randint(0, 10000)
        print("Put task %d..." % n)
        task.put(n)
    # 從result隊(duì)列讀取結(jié)果:
    print("Try get results...")
    for i in range(13):
        r = result.get(timeout=10)
        print("Result: %s" % r)

    # 關(guān)閉:
    manager.shutdown()
    print("master exit.")
if __name__=="__main__":
    freeze_support()
    print("start!")
    test()

運(yùn)行程序,會(huì)等待執(zhí)行結(jié)果10s,如果沒(méi)有worker端獲取任務(wù),返回結(jié)果,程序?qū)?bào)錯(cuò)。

當(dāng)我們?cè)谝慌_(tái)機(jī)器上寫(xiě)多進(jìn)程程序時(shí),創(chuàng)建的 Queue 可以直接拿來(lái)用,但是,在分布式多進(jìn)程環(huán)境下,添加任務(wù)到Queue不可以直接對(duì)原始的 task_queue 進(jìn)行操作,那樣就繞過(guò)了QueueManager 的封裝,必須通過(guò)manager.get_task_queue()獲得的 Queue 接口添加。

# coding=utf-8
import time, sys
from queue import Queue
from multiprocessing.managers import BaseManager

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

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

# 連接到服務(wù)器,也就是運(yùn)行task_master.py的機(jī)器:
server_addr = "192.168.1.160"
print("Connect to server %s..." % server_addr)
# 端口和驗(yàn)證碼注意保持與task_master.py設(shè)置的完全一致:
m = QueueManager(address=(server_addr, 4000), authkey=b"sheenstar")
# 從網(wǎng)絡(luò)連接:
try:
    m.connect()
except:
    print("請(qǐng)先啟動(dòng)task_master.py!")
    #sys.exit("sorry, goodbye!");
# 獲取Queue的對(duì)象:
task = m.get_task_queue()
result = m.get_result_queue()
# 從task隊(duì)列取任務(wù),并把結(jié)果寫(xiě)入result隊(duì)列:
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("任務(wù)執(zhí)行結(jié)束,自動(dòng)斷開(kāi)連接")
# 處理結(jié)束:
print("worker exit.")

使用命令行運(yùn)行程序,結(jié)果更直觀

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42481.html

相關(guān)文章

  • python大佬養(yǎng)成計(jì)劃----進(jìn)程、線程與多進(jìn)程

    摘要:在一個(gè)進(jìn)程內(nèi)部,要同時(shí)干多件事,就需要同時(shí)運(yùn)行多個(gè)子任務(wù),我們把進(jìn)程內(nèi)的這些子任務(wù)稱為線程??偨Y(jié)一下,多任務(wù)的實(shí)現(xiàn)方式有三種多進(jìn)程模式多線程模式多進(jìn)程多線程模式線程是最小的執(zhí)行單元,而進(jìn)程由至少一個(gè)線程組成。 進(jìn)程與線程 很多同學(xué)都聽(tīng)說(shuō)過(guò),現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務(wù)的操作系統(tǒng)。 什么叫多任務(wù)呢?簡(jiǎn)單地說(shuō),就是操作系統(tǒng)可以同時(shí)...

    taowen 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃--協(xié)程實(shí)現(xiàn)TCP連接

    摘要:協(xié)程實(shí)現(xiàn)連接在網(wǎng)絡(luò)通信中,每個(gè)連接都必須創(chuàng)建新線程或進(jìn)程來(lái)處理,否則,單線程在處理連接的過(guò)程中,無(wú)法接受其他客戶端的連接。所以我們嘗試使用協(xié)程來(lái)實(shí)現(xiàn)服務(wù)器對(duì)多個(gè)客戶端的響應(yīng)。 協(xié)程實(shí)現(xiàn)TCP連接 在網(wǎng)絡(luò)通信中,每個(gè)連接都必須創(chuàng)建新線程(或進(jìn)程) 來(lái)處理,否則,單線程在處理連接的過(guò)程中, 無(wú)法接受其他客戶端的連接。所以我們嘗試使用協(xié)程來(lái)實(shí)現(xiàn)服務(wù)器對(duì)多個(gè)客戶端的響應(yīng)。與單一TCP通信的構(gòu)架...

    fuchenxuan 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃-----多進(jìn)程

    摘要:多進(jìn)程執(zhí)行任務(wù)結(jié)束,創(chuàng)建進(jìn)程和銷毀進(jìn)程是時(shí)間的,如果長(zhǎng)度不夠,會(huì)造成多線程快過(guò)多進(jìn)程多線程執(zhí)行任務(wù)結(jié)束,進(jìn)程間通信生產(chǎn)者消費(fèi)者模型與隊(duì)列演示了生產(chǎn)者和消費(fèi)者的場(chǎng)景。 進(jìn)程 Python是運(yùn)行在解釋器中的語(yǔ)言,查找資料知道,python中有一個(gè)全局鎖(GIL),在使用多進(jìn)程(Thread)的情況下,不能發(fā)揮多核的優(yōu)勢(shì)。而使用多進(jìn)程(Multiprocess),則可以發(fā)揮多核的優(yōu)勢(shì)真正地提...

    zhangfaliang 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----socket網(wǎng)絡(luò)編程

    摘要:一個(gè)包來(lái)了之后,到底是交給瀏覽器還是,就需要端口號(hào)來(lái)區(qū)分。每個(gè)網(wǎng)絡(luò)程序都向操作系統(tǒng)申請(qǐng)唯一的端口號(hào),這樣,兩個(gè)進(jìn)程在兩臺(tái)計(jì)算機(jī)之間建立網(wǎng)絡(luò)連接就需要各自的地址和各自的端口號(hào)。 網(wǎng)絡(luò)通信的三要素 IP 通信的時(shí)候, 雙方必須知道對(duì)方的標(biāo)識(shí), 好比發(fā)郵件必須知道對(duì)方的郵件地址。 互聯(lián)網(wǎng)上每個(gè)計(jì)算機(jī)的唯一標(biāo)識(shí)就是IP地址, 類似 123.123.123.123 。 IP地址實(shí)際上是一個(gè)32位...

    phodal 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----socket實(shí)現(xiàn)TCP通信

    摘要:我們來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的服務(wù)器程序,它接收客戶端連接,回復(fù)客戶端發(fā)來(lái)的請(qǐng)求。如果一切順利,新浪的服務(wù)器接受了我們的連接,一個(gè)連接就建立起來(lái)的,后面的通信就是發(fā)送網(wǎng)頁(yè)內(nèi)容了。 TCP TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四...

    layman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<