Gearman GearmanClient::addTaskBackground
(PECL gearman >= 0.5.0)
GearmanClient::addTaskBackground — 병렬로 실행할 백그라운드 작업 추가
설명
public GearmanClient::addTaskBackground( string $function_name, string $workload, mixed &$context = ?, string $unique = ? ): GearmanTask
다른 작업과 병렬로 실행할 백그라운드 작업을 추가합니다. 모든 작업이 병렬로 실행되도록 이 메서드를 호출한 다음 GearmanClient::runTasks()를 호출하여 작업을 수행합니다.
매개변수
function_name
- 작업자가 실행할 등록된 함수
workload
- 처리할 직렬화된 데이터
context
- 작업과 연결할 애플리케이션 컨텍스트
unique
- 특정 작업을 식별하는 데 사용되는 고유 ID
반환 값
작업을 추가할 수 없는 경우 GearmanTask 개체 또는 false
입니다.
Examples
예제 #1 Two tasks, one background and one not
이 예는 백그라운드 작업과 일반 작업 실행의 차이점을 보여줍니다. 클라이언트는 동일한 함수를 실행하기 위해 두 개의 작업을 추가하지만 하나는 addTaskBackground()로 추가됩니다. 작업의 진행 상황을 추적할 수 있도록 콜백이 설정됩니다. 인위적인 지연이 있는 단순 작업자는 작업 진행 상황을 보고하고 클라이언트는 콜백을 통해 이를 선택합니다. 이 예제에서는 두 개의 작업자가 실행됩니다. 백그라운드 작업은 클라이언트 출력에 표시되지 않습니다.
<?php
# The client script
# create our gearman client
$gmc= new GearmanClient();
# add the default job server
$gmc->addServer();
# set a couple of callbacks so we can track progress
$gmc->setCompleteCallback("reverse_complete");
$gmc->setStatusCallback("reverse_status");
# add a task for the "reverse" function
$task= $gmc->addTask("reverse", "Hello World!", null, "1");
# add another task, but this one to run in the background
$task= $gmc->addTaskBackground("reverse", "!dlroW olleH", null, "2");
if (! $gmc->runTasks())
{
echo "ERROR " . $gmc->error() . "\n";
exit;
}
echo "DONE\n";
function reverse_status($task)
{
echo "STATUS: " . $task->unique() . ", " . $task->jobHandle() . " - " . $task->taskNumerator() .
"/" . $task->taskDenominator() . "\n";
}
function reverse_complete($task)
{
echo "COMPLETE: " . $task->unique() . ", " . $task->data() . "\n";
}
?>
<?php
# The worker script
echo "Starting\n";
# Create our worker object.
$gmworker= new GearmanWorker();
# Add default server (localhost).
$gmworker->addServer();
# Register function "reverse" with the server.
$gmworker->addFunction("reverse", "reverse_fn");
print "Waiting for job...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}
function reverse_fn($job)
{
echo "Received job: " . $job->handle() . "\n";
$workload = $job->workload();
$workload_size = $job->workloadSize();
echo "Workload: $workload ($workload_size)\n";
# This status loop is not needed, just showing how it works
for ($x= 0; $x < $workload_size; $x++)
{
echo "Sending status: " . ($x + 1) . "/$workload_size complete\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}
$result= strrev($workload);
echo "Result: $result\n";
# Return what we want to send back to the client.
return $result;
}
?>
실행 중인 두 작업자에 대한 작업자 출력:
Received job: H:foo.local:65 Workload: !dlroW olleH (12) 1/12 complete Received job: H:foo.local:66 Workload: Hello World! (12) Sending status: 1/12 complete Sending status: 2/12 complete Sending status: 2/12 complete Sending status: 3/12 complete Sending status: 3/12 complete Sending status: 4/12 complete Sending status: 4/12 complete Sending status: 5/12 complete Sending status: 5/12 complete Sending status: 6/12 complete Sending status: 6/12 complete Sending status: 7/12 complete Sending status: 7/12 complete Sending status: 8/12 complete Sending status: 8/12 complete Sending status: 9/12 complete Sending status: 9/12 complete Sending status: 10/12 complete Sending status: 10/12 complete Sending status: 11/12 complete Sending status: 11/12 complete Sending status: 12/12 complete Sending status: 12/12 complete Result: !dlroW olleH Result: Hello World!
Client output:
STATUS: 1, H:foo.local:66 - 1/12 STATUS: 1, H:foo.local:66 - 2/12 STATUS: 1, H:foo.local:66 - 3/12 STATUS: 1, H:foo.local:66 - 4/12 STATUS: 1, H:foo.local:66 - 5/12 STATUS: 1, H:foo.local:66 - 6/12 STATUS: 1, H:foo.local:66 - 7/12 STATUS: 1, H:foo.local:66 - 8/12 STATUS: 1, H:foo.local:66 - 9/12 STATUS: 1, H:foo.local:66 - 10/12 STATUS: 1, H:foo.local:66 - 11/12 STATUS: 1, H:foo.local:66 - 12/12 COMPLETE: 1, !dlroW olleH DONE
기타
- GearmanClient::addTask() - 병렬로 실행할 작업 추가
- GearmanClient::addTaskHigh() - 병렬로 실행할 높은 우선 순위 작업 추가
- GearmanClient::addTaskLow() - 병렬로 실행할 낮은 우선 순위 작업 추가
- GearmanClient::addTaskHighBackground() - 병렬로 실행할 높은 우선 순위의 백그라운드 작업 추가
- GearmanClient::addTaskLowBackground() - 병렬로 실행할 낮은 우선 순위 백그라운드 작업 추가
- GearmanClient::runTasks() - 작업 목록을 병렬로 실행