Анализ файла с Beanstalkd Queue

В настоящее время я переписываю загрузчик файлов. Сценарии синтаксического анализа для различных типов данных, которые существуют в настоящее время, являются сценариями Perl. Программа написана на php. В настоящее время он позволяет загружать только один файл, и, как только файл окажется на сервере, он вызовет скрипт perl для типа данных загруженного файла. У нас более 20 типов данных.

На данный момент я написал новую систему, которая позволяет загружать несколько файлов. Он сначала позволит вам проверить ваши атрибуты перед загрузкой, сжать их с помощью zipjs, загрузить заархивированный файл, распаковать его на сервер, для каждого файла вызвать для него анализатор.

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

for each file
$job = "exec('location/to/file/parser.pl file');";
// using the pheanstalkd library
$this->pheanstalk->useTube('testtube')->put($job);

В зависимости от файла, анализ может занять 2 минуты или 20 минут. Когда я помещаю задание в очередь, мне нужно убедиться, что анализатор для file2 запускается после того, как анализатор для file1 завершается. Как я могу это сделать? Спасибо

0

Решение

Beanstalk не имеет понятия зависимости между заданиями. У вас, кажется, есть две работы:

  • Задание А: Разбор файла 1
  • Задание B: анализ файла 2

Если вам нужно, чтобы задание B выполнялось только после задания A, самый простой способ сделать это для задания A — создать задание B в качестве своего последнего действия.

0

Другие решения

Я добился того, чего хотел — запрашивать больше времени, если анализатор занимает больше минуты. Worker — это php-скрипт, и я могу получить идентификатор процесса, когда выполняю команду «exec» для исполняемого файла парсера. В настоящее время я использую фрагмент кода ниже в моем работнике.

$job = $pheanstalk->watch( $tubeName )->reserve();
// do some more stuff here ... then
// while the parser is running on the server
while( file_exists( "/proc/$pid" ) )
{
// make sure the job is still reserved on the queue server
if( $job )  {
// get the time left on the queue server for the job
$jobStats = $pheanstalk->statsJob( $job );
// when there is not enough time, request more
if( $jobStats['time-left'] < 5 ){
echo "requested more time for the job at ".$jobStats['time-left']." secs left \n";
$pheanstalk->touch( $job );
}
}
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector