Работа через XHE Manager

вопросы и ответы по использованию PHP
Ответить
nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Работа через XHE Manager

Сообщение nikson » 27 фев 2014, 03:43

Добрый вечер!

Помогите разобраться с синхронизацией потоков через XHE Manager. Как задать нужные аргументы?

Для примера возьмем простую задачу, есть список URL, нужно проверить одно условие, если TRUE то добавляем к примеру в файл url.txt если FALSE то в url2.txt.

Этот список будет общим для всех потоков (собственно вопрос в синхронизации), также список url и url2 будет общим для всех потоков.

Germ
Сообщения: 44
Зарегистрирован: 09 июл 2010, 19:14

Re: Работа через XHE Manager

Сообщение Germ » 28 фев 2014, 10:58

Тут, менеджер ни при чем. Менеджер, действительно, управляет(в теории) потоками ХНЕ.
А то, о чем говорите вы - совместный доступ потоков к данным.
Как вариант можно избежать этой сложности совсем - поделить исходный фал на куски и каждому потоку отдать его "кусок".
Либо читать исходный файл и сразу удалять строку, с которой будет работать копия. Тут и при записи результата понадобится http://au2.php.net/flock

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Работа через XHE Manager

Сообщение nikson » 28 фев 2014, 12:45

Да, я имею ввиду про совместный доступ. Вариант с делением файлов на куски не подходит. Второй вариант с блокировкой тоже не подходит, у меня все действия в цикле, если ставить flock, то какой смысл в многопоточности если каждый поток будет ждать отключения блокировки.

Можно как-то задать глобальную переменную, повесить ее на счетчик и передать в качестве аргумента в менеджере потока?

Возьмем для примера простой цикл:

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

$file_url = file("data/url.txt");
$file_res = "res/url.txt";

for($i = 0; $i < count($file_url); $i++) {
$url = trim($file_url[$i]);
$browser->navigate($url);
Как задать аргумент чтобы каждый поток брал строку со своим номером $i? Не совсем понимаю как это делается на XHE, ведь тут каждый поток это отдельная копия, у каждой копии свой счетчик и тд и тп. На дескопе это реализуется простой критической секцией.

Germ
Сообщения: 44
Зарегистрирован: 09 июл 2010, 19:14

Re: Работа через XHE Manager

Сообщение Germ » 28 фев 2014, 15:05

nikson писал(а):Второй вариант с блокировкой тоже не подходит, у меня все действия в цикле, если ставить flock, то какой смысл в многопоточности если каждый поток будет ждать отключения блокировки.
Не пойму зачем ждать полного окончания цикла.
Я бы сделал так:
Копия пытается открыть файл для чтения/записпи. Если нет флока - ставит, читает файл, выдергивает из массива строку, перезаписывает файл массивом уже без строки, отключает флок и дальше делает что надо. Секунда делов:)

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Работа через XHE Manager

Сообщение nikson » 28 фев 2014, 16:08

Как это будет выглядеть на примере выложенного мною выше цикла? Или все только на словах сделали бы?

Germ
Сообщения: 44
Зарегистрирован: 09 июл 2010, 19:14

Re: Работа через XHE Manager

Сообщение Germ » 28 фев 2014, 17:36

Может еще пожевать?
Вы правы, в этом случае будет на словах.

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Работа через XHE Manager

Сообщение nikson » 28 фев 2014, 18:00

Germ писал(а):Может еще пожевать?
Вы правы, в этом случае будет на словах.
Это я к тому что ваш способ с блокировкой в цикле не уместен, поэтому примера вы привести не сможете. Когда не знаешь лучше промолчать, чем городить ахинею.

Germ
Сообщения: 44
Зарегистрирован: 09 июл 2010, 19:14

Re: Работа через XHE Manager

Сообщение Germ » 28 фев 2014, 21:47

Вы ошибаетесь, этот способ есть, он работает, и да, он уместен:)

ЗЫ:
nikson писал(а):Когда не знаешь лучше промолчать, чем городить ахинею
Золотые слова!
Ну или более конкретно: Когда просишь помощи - хамить не помогает.
Удачи;)

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Работа через XHE Manager

Сообщение nikson » 01 мар 2014, 03:17

Извиняюсь, возможно неправильно выразился, но хамить я не хотел.

Но ваш способ все равно неуместен, неуместен именно в XHE. Смысл этой блокировки, ведь в XHE потоки это копии, пусть даже я включу блокировку но это ничего не изменит, так как нельзя задать глобальную переменную в менеджере потоков, от чего потоки будут отталкиваться делая перезапись массива, ведь у каждого потока свой массив и своя локальная переменная.

Если только как вариант попробовать сразу удалять строку, тогда и переменная не понадобиться...

Ответить