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

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

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

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

    安裝Workerman

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

composer require workerman/workerman

登錄后復(fù)制

    創(chuàng)建服務(wù)端程序

我們來創(chuàng)建一個(gè)名為server.php的服務(wù)端程序,通過運(yùn)行該程序,客戶端就可以將計(jì)算任務(wù)提交給服務(wù)端,服務(wù)端負(fù)責(zé)將任務(wù)分配給計(jì)算節(jié)點(diǎn)來進(jìn)行計(jì)算,并將最終結(jié)果返回給客戶端。以下是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();

登錄后復(fù)制

在上述代碼中,我們使用服務(wù)器監(jiān)聽端口,等待客戶端提交任務(wù)。當(dāng)服務(wù)端接收到客戶端提交的任務(wù)后,服務(wù)端會將任務(wù)分配給一個(gè)計(jì)算節(jié)點(diǎn)來進(jìn)行計(jì)算,并將返回結(jié)果給客戶端。

在Worker類的實(shí)例中,我們配置了4個(gè)進(jìn)程來處理客戶端請求。在onMessage事件回調(diào)中,我們首先從客戶端提交的JSON數(shù)據(jù)中獲取worker_num和task_data,在創(chuàng)建一個(gè)新的Task實(shí)例,并將任務(wù)發(fā)送給計(jì)算節(jié)點(diǎn),等待計(jì)算結(jié)果返回。

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

    創(chuàng)建計(jì)算節(jié)點(diǎn)程序

接下來,我們來創(chuàng)建一個(gè)名為worker.php的計(jì)算節(jié)點(diǎn)程序。該程序?qū)诜?wù)端將計(jì)算任務(wù)分配給它后,進(jìn)行計(jì)算,并將結(jié)果返回給服務(wù)端。以下是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();

登錄后復(fù)制

在上述代碼中,我們使用TCP套接字監(jiān)聽一個(gè)端口,等待服務(wù)端分配計(jì)算任務(wù)。當(dāng)有計(jì)算任務(wù)需要處理時(shí),我們從任務(wù)數(shù)據(jù)中獲取需要處理的數(shù)據(jù),進(jìn)行計(jì)算,并將結(jié)果發(fā)送給服務(wù)端。

    創(chuàng)建客戶端程序

最后,我們需要?jiǎng)?chuàng)建一個(gè)名為client.php的客戶端程序,用于提交計(jì)算任務(wù)給服務(wù)端,并獲取計(jì)算結(jié)果。以下是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;
    }
}

登錄后復(fù)制

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

總結(jié)

分享到:
標(biāo)簽:Workerman 分布式 計(jì)算
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

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

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定