Несколько работников Gearman получают одинаковую работу - PullRequest
0 голосов
/ 31 августа 2018

У меня работают два работника одновременно, в настоящее время они оба получают одинаковую работу в одно и то же время. У меня сложилось впечатление, что, пока работник А выполнял работу, работник Б получал следующую работу в очереди. Каждое задание занимает около 10 секунд. Как мне это сделать?

Я упростил свой код до этого: (скажем, клиент вызывается дважды с интервалом в две секунды)

КЛИЕНТ

$client = new GearmanClient();
$client->addServer();

$client->doBackground("my_task");

РАБОЧИЙ

$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("my_task", "my_task_fn");

while($worker->work());

function my_task_fn($job) {
    echo $job->handle(); // both workers show same job #, I want each worker getting a different job
    sleep(10);
}

1 Ответ

0 голосов
/ 15 октября 2018

То, что вы описываете, не должно происходить, я привел пример того, как вы можете освоиться. Клиентский сценарий не будет завершен, пока рабочий ответ с ответом. Но вы можете легко адаптироваться, изменив «doNormal» на «doBackground». Поместите счетчик сна в свою рабочую функцию, чтобы замедлить работника, и поместите своего клиента в цикл, чтобы создать множество рабочих мест, чтобы увидеть процесс, работающий легче.

Код клиента

// Create our client object
$client = new GearmanClient();

// Add a server
$client->addServer(); // by default host/port will be "localhost" & 4730

echo "Sending job\n";

// Send reverse job
$result = $client->doNormal("reverse", "Hello!");
if ($result) {
    echo "Success: $result\n";
}

Рабочий код

// Create our worker object
$worker = new GearmanWorker();

// Add a server (again, same defaults apply as a worker)
$worker->addServer();

// Inform the server that this worker can process "reverse" function calls
$worker->addFunction("reverse", "reverse_fn");

while (1) {
    print "Waiting for job...\n";
    $ret = $worker->work(); // work() will block execution until a job is delivered
    if ($worker->returnCode() != GEARMAN_SUCCESS) {
        break;
    }
}

// A much simple reverse function
function reverse_fn(GearmanJob $job) {
    $workload = $job->workload();
    echo "Received job: " . $job->handle() . "\n";
    echo "Workload: $workload\n";
    $result = strrev($workload);
    echo "Result: $result\n";
    return $result;
}
...