Этот проект представляет собой пул корутин Swoole, который включает в себя некоторые полезные операции с корутинами Swoole. Он прост в использовании.
Используется для сценариев, требующих большого количества задач корутины. Он может ограничивать количество одновременно работающих корутин и уменьшать потери, связанные с частым созданием и уничтожением корутин.
Предназначен для одновременного выполнения нескольких корутин и позволяет получить все их возвращаемые значения.
Группа полного стека PHP Yurun: 17916227 , если у вас есть вопросы, вам помогут найти ответ и решить проблему.
Ежедневная группа по плаванию программистов: 74401592 .
Добавьте конфигурацию в ваш composer.json:
{
"require": {
"yurunsoft/swoole-co-pool": "^1.3.0"
}
}
Затем выполните команду composer update
.
use Yurun\Swoole\CoPool\CoPool;
use Yurun\Swoole\CoPool\Interfaces\ICoTask;
use Yurun\Swoole\CoPool\Interfaces\ITaskParam;
$coCount = 10; // количество одновременно работающих корутин
$queueLength = 1024; // длина очереди
$pool = new CoPool($coCount, $queueLength,
// определение задачи анонимного класса, конечно, вы также можете определить его как обычный класс, передав полное имя класса
new class implements ICoTask
{
/**
* Выполнение задачи
*
* @param ITaskParam $param
* @return mixed
*/
public function run(ITaskParam $param)
{
// выполнение задачи
return true; // необязательно возвращать результат выполнения задачи
}
});
$pool->run();
$data = 1; // можно передать любой параметр
// добавить задачу и приостановить корутину, ожидая возврата результата выполнения задачи
$result = $pool->addTask($data);
// добавить задачу асинхронно
$result = $pool->addTaskAsync($data, function(ITaskParam $param, $data){
// асинхронный обратный вызов
});
// добавить групповую задачу и приостановить корутину, ожидая возвращения результата выполнения задачи
$result = $pool->addTask($data, 'групповое название');
// добавить групповую задачу асинхронно
$result = $pool->addTaskAsync($data, function(ITaskParam $param, $data){
// асинхронный обратный вызов
}, 'групповое название');
$pool->wait(); // ожидание остановки пула корутин, без ограничения времени, true/false
$pool->wait(60); // ожидание остановки пула корутин в течение 60 секунд, если -1, то без ограничения времени, true/false
Каждая функция выполняется в отдельной корутине, а затем результаты могут быть объединены.
$batch = new CoBatch([
function(){
return 'imi';
},
'a' => function(){
return 'niu';
},
'b' => function(){
return 'bi';
},
]);
$results = $batch->exec();
// $timeout = -1; // поддержка тайм-аута
// $limit = -1; // ограничение количества одновременно работающих корутин
// $results = $batch->exec($timeout, $limit);
var_dump($results);
// значение $results:
// [
// 'imi',
// 'a' => 'niu',
// 'b' => 'bi',
// ]
Быстрые функции:
use function Yurun\Swoole\Coroutine\batch;
batch([
function(){
return 'imi';
},
'a' => function(){
return 'niu';
},
'b' => function(){
return 'bi';
},
]);
// batch($callables, $timeout, $limit);
use function Yurun\Swoole\Coroutine\goWait;
$result = goWait(function(){
\Swoole\Coroutine::sleep(1);
return 'результат ожидания';
});
echo $result; // результат ожидания
use Yurun\Swoole\CoPool\ChannelContainer;
go(function(){
$channelContainer = new ChannelContainer;
$id = 'abc';
$data = [
'время' => time(),
];
go(function() use($id, $data, $channelContainer){
echo 'Подождите 3 секунды...', PHP_EOL;
\Swoole\Coroutine::sleep(3);
$channelContainer->push($id, $data);
});
var_dump($channelContainer->pop($id));
});
Смотрите каталог example
Открытый исходный код не требует прибыли, сколько бы ни было, это всё от души, жизнь непроста, пусть будет как будет…
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )