Что нового

Как отслеживать в скрипте чтобы работало не более n процессов

composter

Новичок
Сообщения
3
Репутация
0
Добрый день.
У меня есть массив со списком файлов (допустим 15) сейчас я тупо разбиваю список на 3 части (по 5 файлов)и отправляю их на запуск таким образом
Код:
$tempPID=    Run( '"C:\Program Files\A....бла бла бла"')
дело в том что время обработки файлов может сильно различаться, одна часть может выполнится за 20 минут ,а другая 1,5 часа.
У меня возникла мысль, что эффективней было запустить 3 процесса (такое число потому что 3 процесса сжирают 90-95% оперативы и больше не имеет смысла) в каждом процессе обрабатывается 1 файл. И по завершении 1 из 3 процессов (причем не зная какой завершился раньше 1 ,2 или 3) запускался бы следующий процесс с обработкой файла и т.д. пока список файлов не закончится. Не могу понять как это реализовать.
 

Andrey_A

Продвинутый
Сообщения
281
Репутация
55
как это реализовать
Когда-то что-то подобное делал - выдернул из кода, возможно и попроще можно сделать - у меня так:
Код:
Dim $aRet[3] ; массив с PID-ами процессов
Dim $aPath[20] ; массив с файлами надо заполнить
For $i=0 To UBound($aPath)-1
  $sFile=$aPath[$i]
  Do
    Sleep(99)
    For $j=0 To 2
      $aRet[$j]=ProcessExists($aRet[$j])
    Next
  Until 0=$aRet[0]Or 0=$aRet[1]Or 0=$aRet[2]
  If 0=$aRet[0]Then
    $aRet[0]=Run($sFile)
  ElseIf 0=$aRet[1]Then
    $aRet[1]=Run($sFile)
  ElseIf 0=$aRet[2]Then
    $aRet[2]=Run($sFile)
  EndIf
Next
 
Автор
C

composter

Новичок
Сообщения
3
Репутация
0
спасибо, вечером затестю !
а close (pid) не надо делать? или они автоматически закроются?
 

Andrey_A

Продвинутый
Сообщения
281
Репутация
55
или они автоматически закроются?
Вы сами написали "не зная какой завершился раньше 1 ,2 или 3" - значит не вы их закрываете, а они сами по окончанию какой-то работы... значит PID процесса 0 и close вставлять тут не имеет смысла...
 
Автор
C

composter

Новичок
Сообщения
3
Репутация
0
еще раз спасибо! все работает )))
Сообщение автоматически объединено:

еще вопрос по этому циклу. в целом все работает отлично, но дело в том что
Код:
$aRet[2]=[URL='https://autoit-script.ru/docs/functions/run.htm']Run[/URL]($sFile)
очень долго запускается, и когда идут на запуск последние 2-3 файла цикл закрывается раньше чем начнется запуск файлов (файлы обрабатываются нормально). но дело в том что дальше идет проверка даты файлов в масиве, и она получается запускается раньше и показывает что последние 2-3 файла не запускались (хотя они в итоге нормально отрабатывают ).
Как это можно отловить? у меня мысль только играться со sleep
Код:
$aRet[2]=[URL='https://autoit-script.ru/docs/functions/run.htm']Run[/URL]($sFile) Sleep(15000)
 
Последнее редактирование:

Andrey_A

Продвинутый
Сообщения
281
Репутация
55
Как это можно отловить?
Поставьте после цикла проверку - пока все процессы не станут нулями (пока все не закроются)...
(Перед "проверкой даты файлов в массиве")
Код:
Do
    Sleep(99)
    For $j=0 To 2
      $aRet[$j]=ProcessExists($aRet[$j])
    Next
Until 0=$aRet[0]+$aRet[1]+$aRet[2]

Что касется "очень долго запускается", то тут вопрос не к коду, а к системе или через что вы запускаете - главное чтобы PID возвращался в массив aRet для проверки
 
Верх