Показать полную графическую версию : Выполнение одной программы несколько раз и запись результатов в файл
Megatron13
09-08-2012, 08:32
Собственно вот такая проблема возникла. Есть txt файл. На каждой строчке url. Есть программа которая эти url обрабатывать может, но по одному. Нужно автоматизировать процесс и записать в файл все что выведет программа после обработки.
Обработка 1ого урл в этой программе для современных машин дело плевое, поэтому я захотел блекджека и шлюх, то есть обрабатывать несколько урлов одновременно, хотя это и необязательно, но желательно.
Вобщем как я решил делать.
1) спрашиваю у юзера сколько он хочет обрабатывать урлов одновременно (обычно их несколько десятков тысяч, поэтому как ни крути но работу лучше сделать по частям, кроме того канал у людей не резиновый)
2) далее запускаю несколько экземпляров программы с разными урлами а результаты сохраняю в лог.
3) скорость обработки каждого из урлов будет разная поэтому как только освобождается часть свободного места, количество которого указали в пункте 1, нужно запускать новый экземпляр программы с новым урлом. И вот в этом загвоздка. Как определить, что программа закончила работу с 1им урлом и загрузить ее новым?
Megatron13
09-08-2012, 13:17
Так, ну значит программа моя по окончании своей работы (да кстати она консольная если кто не понял) выдает 100% надпись одну. То есть можно следить за логом и с каждым появлением записи об окончании запускать обработку нового урла. Только вот я не знаю как сделать подобное «слежение».
Megatron13
09-08-2012, 21:08
у меня новый вопрос. как запустить программу с параметрами, а результаты сохранить в лог?
то есть например у меня есть программа file.exe и запускать его надо так:
file.exe -url=http://yandex.ru/
так вот как сохранить в лог то, что выведет программа после запуска? я пытался сделать вот так:
(file.exe -url=http://yandex.ru/)>log.txt
и так
file.exe -url=http://yandex.ru/ > log.txt
результат 1 и тот же:
в логе написано EInOutError: I/O error 6 + название программы.
file.exe -url=http://yandex.ru/ >log.txt
или:
>log.txt file.exe -url=http://yandex.ru/
в логе написано EInOutError: I/O error 6 + название программы. »
Вы уверены, что она что-то выводит в stdout?
Anonymоus
10-08-2012, 08:17
Обработка 1ого урл в этой программе для современных машин дело плевое, поэтому я захотел блекджека и шлюх, то есть обрабатывать несколько урлов одновременно, хотя это и необязательно, но желательно. »
Вам нужны два скрипта.
ThreadBalancer.cmd - тут указывается количество параллельно запущенных потоков, входной файл с url делится поровну между ними
Threads - потоки, Data - файл с URL-ками
@Echo Off
SetLocal EnableDelayedExpansion
:: Настройки
Set Data=data.txt
Set Threads=3
:: Подсчет общего числа строк
Set sCount=0&For /F "usebackq" %%A In ("%Data%") Do Set /A sCount+=1
:: Делим данные на части по количеству потоков
Set /A SingleThread=sCount/Threads
:: Удаляем предыдущие временные данные
Del "%Temp%\$thread*.txt" 2>nul
:: Проверяем, есть ли остаток
Set /A AllThreads=SingleThread*Threads
If %AllThreads%==%sCount% (
rem Без остатка, просто разделяем данные на части по числу потоков
Set cString=0&Set ThreadNum=1&Set /A Reset=SingleThread+1
For /F "useback delims=" %%A In ("%Data%") Do (
Set /A cString+=1
If !cString!==!Reset! (Set /A ThreadNum+=1&Set cString=1)
Echo %%A>>"%Temp%\$thread!ThreadNum!.txt"
)
) Else (
rem Есть остаток, добавляем излишки к последнему потоку
Set cString=0&Set ThreadNum=1&Set /A Reset=SingleThread+1
For /F "useback delims=" %%A In ("%Data%") Do (
Set /A cString+=1
If !cString!==!Reset! (
If Not !ThreadNum! GEQ %Threads% (Set /A ThreadNum+=1)
Set cString=1
)
Echo %%A>>"%Temp%\$thread!ThreadNum!.txt"
)
)
:: Запускаем потоки, выполняющие последовательно каждый свою часть работы
:: Запуск производится в том же окне, чтобы не спамить окнами при большом
:: количество потоков
For /L %%N In (1,1,%Threads%) Do (
Start /B Thread.cmd "%Temp%\$thread%%N.txt"
)
Pause>nul
Thread.cmd
А здесь уже собственно, запускается сама программа, которой поочередно скармливаются URL из диапазона, отданного потоку.
@Echo Off
:: Последовательное выполнение из выделенной потоку очереди
For /F "usebackq delims=" %%A In ("%~1") Do (
something.exe %%A
)
Exit
С вызовом программы сами уже определяйтесь, куда что и как перенаправлять.
Megatron13
10-08-2012, 21:58
так, спасибо за помощь с пунктами 1 и 3.
а со 2ым пунктом я решил поступить вот так:
http://www.cyberforum.ru/win-api/thread626505.html
Megatron13
10-08-2012, 22:37
ууупс, похоже, что из-за конструктивных особенностей программы лучше каждый поток запустить в отдельном окне. в конце концов окна эти можно сделать невидимыми!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.