Помогите запустить в несколько потоков задачу

Все вопросы касающиеся использования
программы можно задать здесь
Ответить
marselkin
Сообщения: 9
Зарегистрирован: 07 авг 2013, 17:07

Помогите запустить в несколько потоков задачу

Сообщение marselkin » 04 дек 2013, 13:55

Следующая задача.
Есть файл txt со строками, которые нужно обработать. (допустим ссылки, на которые надо перейти и что-то сделать)

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

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

Как в этом плане решить задачу очень четко?
Может можно как-то пометить файл, что он открыт другой копией и запретить к нему обращение.
php я начал изучать только пару месяцев назад. Вопрос мне кажется легкий для тех, кто разбирается.
Спасибо.

jafar
Сообщения: 27
Зарегистрирован: 28 апр 2013, 09:55

Re: Помогите запустить в несколько потоков задачу

Сообщение jafar » 04 дек 2013, 16:43

Может не так понял, а что мешает обычным циклом брать строки?
В первой копии программы цикл начитает брать строки с 1 по 100, вторая копия со 101 по 200-ю, и тд.

for ($j=0;$j<100;$j++)
{
$name = file("C:\Program Files\Human Emulator Advanced\DATABASE/name.txt");
$name = rtrim($name[$j]);
}

marselkin
Сообщения: 9
Зарегистрирован: 07 авг 2013, 17:07

Re: Помогите запустить в несколько потоков задачу

Сообщение marselkin » 04 дек 2013, 22:14

Это для каждой копии программы разные скрипты?

Нужно еще удалять эти строки с файла по мере выполнения.

Я хотел чтобы один и тот же скрипт запустить на 10 программах.

marselkin
Сообщения: 9
Зарегистрирован: 07 авг 2013, 17:07

Re: Помогите запустить в несколько потоков задачу

Сообщение marselkin » 05 дек 2013, 16:54

Я придумал решение.

Код: Выделить всё

while (true){ 
if (file_get_contents($wait_puth)!==1){
		file_put_contents($wait_puth, 1);

		$buffer_links = file($file_of_links);
for ($iq=0;$iq<count($buffer_links);$iq++)
		$buffer_links [$iq]=trim($buffer_links [$iq]);


for ($iq=0;$iq<100;$iq++){
		$buffer [$iq]=$buffer_links [$iq];
		unset ($buffer_links [$iq]);
}

		$fp = fopen($file_of_links,"w");
		fputs($fp, implode("\r\n",$buffer_links));
		fclose($fp); 
		file_put_contents($wait_puth, 0);
break;
}
else
{
echo "sleep(5)<br>";
sleep(5);

}
}
Примерно так. Если какой то хуман в этой время переписывает сотню строк с файла себе в массив, значит ждем пять сек.

Ответить