@bears

Вопрос по очередям?

Коллеги, прошу помощи по казалось бы совсем элементарной проблеме. С очередями работаю впервые, и все вроде бы работает как надо, но есть проблема с данными. Суть вопроса - установлен Gearman, в воркере одна функция, получает от клиента массив слов, эти слова должен проверить в другом массиве (общий массив фраз, примерно около миллиона) (сейчас он достается из csv) так вот, если в этом массиве найдено хоть одно слово, то этот элемент массива надо удалить, чтобы в других задачах он уже не участвовал. Простейший пример:
// Client

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

$results = new \StdClass();
$results->value = [];

for ($i = 0; $i < 1000; $i++) {
    $words = []; // вот тут рандомное количество слов

    $client->addTaskHigh("find", json_encode($words), $results, $i);
}

$client->runTasks();




// Worker

$worker= new GearmanWorker(); 
$worker->addServer(); 

$phrases = // массив, данные берутся из csv файла

$worker->addFunction("find", "findPhrases", $phrases);

while ($worker->work());

function findPhrases($job, &$phrases) {
    $words = json_decode($job->workload(), true); // слова, полученные от клиента

    // вот тут то и надо удалить в массиве $phrases все элементы, в которых найдены слова из массива $words
}


Проблема в том, что воркер запускаю к примеру 5 раз через supervisor, и в каждом воркере должен быть актуальный массив с фразами. Пока есть только одна идея - хранить массив фраз в memcached/redis, только все равно не знаю как сделать так, чтобы там данные были актуальные, не циклические запросы же делать? Одна задача выполняется 30-90 секунд.
  • Вопрос задан
  • 360 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы