Rumah > rangka kerja php > Swoole > teks badan

Cara menggunakan Swoole untuk melaksanakan penjadualan tugas tak segerak

WBOY
Lepaskan: 2023-11-07 15:11:01
asal
1130 orang telah melayarinya

Cara menggunakan Swoole untuk melaksanakan penjadualan tugas tak segerak

Swoole ialah rangka kerja komunikasi rangkaian tak segerak yang dibangunkan berdasarkan bahasa PHP Ia menyediakan model dipacu peristiwa serupa dengan Node.js dan pengaturcaraan tak segerak berdasarkan coroutine. Selain senario pengaturcaraan rangkaian biasa, Swoole juga menyokong penjadualan tugas tak segerak, yang boleh membantu kami melaksanakan beberapa logik perniagaan tak segerak dengan cepat dan meningkatkan prestasi dan kebolehskalaan sistem. Artikel ini akan memperkenalkan cara menggunakan Swoole untuk melaksanakan penjadualan tugas tak segerak dan memberikan contoh kod terperinci.

1. Prinsip asas penjadualan tugas tak segerak Swoole

Penjadualan tugas tak segerak Swoole adalah berdasarkan kumpulan proses dan baris gilir mesej. Khususnya, kita boleh pramulakan berbilang sub-proses dengan mencipta kumpulan proses, dan kemudian menambah tugasan yang perlu dilaksanakan pada baris gilir mesej Sub-proses mengeluarkan tugasan daripada baris gilir mesej dan memprosesnya. Kelebihan ini ialah ia boleh mengelakkan kemerosotan prestasi yang disebabkan oleh menyekat IO dalam proses utama, dan ia juga boleh menggunakan sepenuhnya kelebihan CPU berbilang teras untuk meningkatkan keupayaan pelaksanaan tugasan serentak.

Proses pelaksanaan khusus adalah seperti berikut:

  1. Buat kumpulan proses dalam proses utama, dan tetapkan saiz kolam proses dan logik berjalan setiap proses anak.
  2. Proses utama menambah tugasan yang perlu dilakukan pada baris gilir mesej.
  3. Proses kanak-kanak mengeluarkan tugas daripada baris gilir mesej dan memprosesnya.
  4. Lakukan langkah 2-3 dalam gelung sehingga semua tugasan selesai.

2. Pelaksanaan Kod

Di sini, kami akan melaksanakan contoh mudah penjadualan tugas tak segerak. Katakan kita perlu memproses tugas, iaitu mengira perkataan dalam fail teks dan mengembalikan perkataan yang paling kerap dan bilangan kejadiannya. Kita boleh menguraikan tugasan ini kepada beberapa tugas kecil Setiap tugasan kecil membaca sebahagian daripada fail, mengira bilangan kejadian perkataan di dalamnya, dan akhirnya meringkaskan hasilnya.

Berikut ialah pelaksanaan kod penjadualan tugas tak segerak berdasarkan Swoole:

<?php
// 创建一个进程池
$pool = new SwooleProcessPool(4);

// 自定义任务处理逻辑
$pool->on('WorkerStart', function ($pool, $workerId) {
    // 建立消息队列
    $msgQueueKey = ftok(__FILE__, 'a');
    $msgQueue = msg_get_queue($msgQueueKey);

    // 循环处理任务
    while (true) {
        // 从消息队列中获取任务
        $data = null;
        $messageType = 0;
        if (msg_receive($msgQueue, 0, $messageType, 1024, $data, true, MSG_IPC_NOWAIT)) {
            // 执行任务
            $result = handleTask($data);
            // 将处理结果返回主进程
            msg_send($msgQueue, 1, $result);
        } else {
            // 没有任务,等待一段时间
            usleep(100);
        }
    }
});

// 启动进程池
$pool->start();

// 读取文件内容并进行任务拆分
$file = 'test.txt';
$content = file_get_contents($file);
$parts = preg_split('/[s,.!:?"'']/', $content);

// 将任务分发到进程池中
foreach ($parts as $part) {
    $pool->write($part);
}

// 等待所有任务执行完毕
$results = [];
for ($i = 0; $i < count($parts); $i++) {
    $result = null;
    $pool->read($result);
    $results[] = $result;
}

// 汇总任务执行结果
$wordCount = [];
foreach ($results as $result) {
    foreach ($result as $word => $count) {
        if (!isset($wordCount[$word])) {
            $wordCount[$word] = 0;
        }
        $wordCount[$word] += $count;
    }
}

// 获取出现次数最多的单词及其出现次数
arsort($wordCount);
$mostFrequentWord = key($wordCount);
$mostFrequentCount = current($wordCount);

echo "Most frequent word: $mostFrequentWord ($mostFrequentCount occurrences)
";

// 自定义任务处理函数
function handleTask($data)
{
    $wordCount = [];
    foreach (explode(' ', $data) as $word) {
        if (mb_strlen($word) > 0 && mb_strlen($word) <= 20) {
            if (!isset($wordCount[$word])) {
                $wordCount[$word] = 0;
            }
            $wordCount[$word]++;
        }
    }
    return $wordCount;
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula mencipta kumpulan proses dan mewujudkan baris gilir mesej dan tugasan proses dalam acara WorkerStart bagi setiap proses anak. Kemudian, kami membaca fail input dan melakukan pemisahan tugas dan mengedarkan setiap tugas kecil ke kumpulan proses. Akhir sekali, kami menunggu semua tugasan selesai dan meringkaskan hasil pelaksanaan. Dalam proses ini, memandangkan keseluruhan proses menggunakan model tak segerak dan kumpulan proses boleh mengendalikan berbilang tugas pada masa yang sama, kecekapan pelaksanaan tugas telah dipertingkatkan lagi.

Ringkasan:

Artikel ini memperkenalkan cara menggunakan Swoole untuk melaksanakan penjadualan tugas tak segerak dan menyediakan contoh kod terperinci. Memandangkan keperluan perniagaan terus meningkat, penyegerakan akan menjadi bahagian penting dalam reka bentuk sistem, dan rangka kerja pengaturcaraan tak segerak yang cekap dan stabil yang disediakan oleh Swoole boleh membantu kami melaksanakan penjadualan tugas tak segerak dengan lebih baik dan meningkatkan prestasi serta kebolehpercayaan sistem.

Atas ialah kandungan terperinci Cara menggunakan Swoole untuk melaksanakan penjadualan tugas tak segerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan