日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

分布式計算系統是指將一組計算機視為單個系統來協同完成計算任務的一種計算模式。在實踐中,分布式計算系統可以通過增加計算機數量來提高計算速度,同時可以解決大量數據的處理問題。Workerman是一個可以用PHP語言實現分布式計算系統的框架,本文將介紹如何使用Workerman實現一個簡單的分布式計算系統,并提供代碼示例。

    安裝Workerman

首先,我們需要安裝Workerman。可以通過Composer來進行安裝,具體命令如下:

composer require workerman/workerman

登錄后復制

    創建服務端程序

我們來創建一個名為server.php的服務端程序,通過運行該程序,客戶端就可以將計算任務提交給服務端,服務端負責將任務分配給計算節點來進行計算,并將最終結果返回給客戶端。以下是server.php的代碼示例:

<?php
use WorkermanWorker;

require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('text://0.0.0.0:2346');

$worker->count = 4;

$worker->onMessage = function($connection, $data){
    $params = json_decode($data, true);

    $worker_num = $params['worker_num'];
    $task_data = $params['task_data'];

    $task_id = md5($task_data);

    $task_worker = new Task($task_id);
    $task_worker->send([
        'worker_num' => $worker_num,
        'task_data' => $task_data
    ]);
  
    $connection->send(json_encode([
        'task_id' => $task_id
    ]));
};

class Task{
    protected $task_id;
  
    protected $worker_num;

    protected $task_data;

    public function __construct($task_id){
        $this->task_id = $task_id;
    }

    public function send($data){
        $task_data = json_encode([
            'task_id' => $this->task_id,
            'data' => $data
        ]);

        $worker_num = $data['worker_num'];
        $socket_name = "tcp://127.0.0.1:".(2347 + $worker_num);

        $client = stream_socket_client($socket_name, $errno, $errstr);
  
        fwrite($client, $task_data);
        fclose($client);
    }
}

Worker::runAll();

登錄后復制

在上述代碼中,我們使用服務器監聽端口,等待客戶端提交任務。當服務端接收到客戶端提交的任務后,服務端會將任務分配給一個計算節點來進行計算,并將返回結果給客戶端。

在Worker類的實例中,我們配置了4個進程來處理客戶端請求。在onMessage事件回調中,我們首先從客戶端提交的JSON數據中獲取worker_num和task_data,在創建一個新的Task實例,并將任務發送給計算節點,等待計算結果返回。

在Task類中,我們存儲了任務ID(task_id)、所需計算的節點編號(worker_num)和需要計算的數據(task_data)。send()方法用于向指定的計算節點發送任務。在這里,我們使用了stream_socket_client()函數來實現TCP套接字客戶端,用于與指定計算節點通信。

    創建計算節點程序

接下來,我們來創建一個名為worker.php的計算節點程序。該程序將會在服務端將計算任務分配給它后,進行計算,并將結果返回給服務端。以下是worker.php的代碼示例:

<?php
use WorkermanWorker;

require_once __DIR__ . '/vendor/autoload.php';

$worker_num = intval($argv[1]);

$worker = new Worker("tcp://0.0.0.0:". (2347 + $worker_num));

$worker->onMessage = function($connection, $data){
    $params = json_decode($data, true);
    $task_id = $params['task_id'];

    $task_data = $params['data'];

    $result = strlen($task_data);

    $connection->send(json_encode([
        'task_id' => $task_id,
        'result' => $result
    ]));
};

Worker::runAll();

登錄后復制

在上述代碼中,我們使用TCP套接字監聽一個端口,等待服務端分配計算任務。當有計算任務需要處理時,我們從任務數據中獲取需要處理的數據,進行計算,并將結果發送給服務端。

    創建客戶端程序

最后,我們需要創建一個名為client.php的客戶端程序,用于提交計算任務給服務端,并獲取計算結果。以下是client.php的代碼示例:

<?php
use WorkermanWorker;

require_once __DIR__ . '/vendor/autoload.php';

$client = stream_socket_client("tcp://127.0.0.1:2346", $errno, $errstr);

$data = [
    'worker_num' => 1,
    'task_data' => 'Workerman is a high-performance PHP socket framework'
];

$json_data = json_encode($data);

fwrite($client, $json_data);
$result = fread($client, 8192);

fclose($client);

$result_data = json_decode($result, true);

$task_id = $result_data['task_id'];

foreach(range(0,3) as $worker_num){
    $worker_client = stream_socket_client("tcp://127.0.0.1:". (2347 + $worker_num), $errno, $errstr);

    fwrite($worker_client, json_encode([
        'task_id' => $task_id,
        'worker_num' => $worker_num
    ]));

    $worker_result = fread($worker_client, 8192);

    $worker_result_data = json_decode($worker_result, true);

    if($worker_result_data['task_id'] == $task_id){
        echo "Result: " . $worker_result_data['result'] . PHP_EOL;
        break;
    }
}

登錄后復制

在上述代碼中,我們首先創建一個TCP套接字客戶端連接到計算節點。在這里使用了fread()函數來從服務端獲取計算任務的返回結果。然后我們將task_id作為參數發送給所有的計算節點,等待返回結果。根據任務ID(task_id),我們可以識別哪個計算節點返回了計算結果。最終我們可以輸出計算結果。

總結

分享到:
標簽:Workerman 分布式 計算
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定