Как упростить задачу с очередями и распараллеливанием на PHP?

denisOg

Новичок
Есть задача обработать большие данные (две связанные таблицы по 1 млн записей). Обработать, в смысле сделать математ просчеты,
и записать в новые таблицы результаты.
Сделал следующим образом:
-- распаралелил процессы(один парсер), так как очень долго выполняется один просчет.
-- запускаю последовательно пять парсеров (пять классов).

Запускаю через exec() и sleep(mt_rand(1,10)) в несколько потоков каждй скрипт.
При распаралеливании возникла проблема, что парсеры дублируют данные, которые будут обрабатывать. Следовательно,
нужно что бы каждый парсер бронировал за собой записи. Потом появилась потребность в очередях, так как,
все равно получается дублирование. Очереди создал через файл. При начале бронирования в конец файла пишется случайный хеш
и потом через do {}while(пока мой хеш не будет первыйм в списке - ждать, а как будет первым удалить хеш из файла).

Мне кажется, что я сделал сложно и не опытно. Посоветуйте, может можно использовать новые технологии или по более простому?
 

fixxxer

К.О.
Партнер клуба
Можно использовать старые технологии.
Форкаешь N воркеров, в воркерах блокирующе читаешь один и тот же сокет (или пайп), открытый еще в родительском процессе, в него шлешь задания.
 

denisOg

Новичок
Можно использовать старые технологии.
Форкаешь N воркеров, в воркерах блокирующе читаешь один и тот же сокет (или пайп), открытый еще в родительском процессе, в него шлешь задания.
Спасибо. С форками, воркеами, родительскими процессами - вообще не знаком. Посоветуете, что почитать для быстрого и правильного погружения :) Ну ,если чо, могу и погуглить...
 

HraKK

Мудак
Команда форума
легко пишешь в мемкеш ключ записи - лок
PHP:
function getLock($id)
    {
        $attempts = 5;
        $result = false;
        $i = 0;
        while($i < $attempts)
        {
            if ($memcache->add("lock_".$id,1000))
            {
                $result = true;
                break;
            }
            $i++;
            usleep(50);
        }
       
        return result;
    }

$id = 42;
if (false == getLock($id))
{
    //Skip
}

// to do
 

AmdY

Пью пиво
Команда форума
Это абсолютно бессмысленно для cpu-bound задач.
а мне кажется подойдёт, корутины да ещё асинхронные запросы в mysqli - сам то. всё равно он будет прстаивать на локах, особенно, если данные зависят друг от друга.
 
Сверху