Добрый вечер!
Помогите разобраться с синхронизацией потоков через XHE Manager. Как задать нужные аргументы?
Для примера возьмем простую задачу, есть список URL, нужно проверить одно условие, если TRUE то добавляем к примеру в файл url.txt если FALSE то в url2.txt.
Этот список будет общим для всех потоков (собственно вопрос в синхронизации), также список url и url2 будет общим для всех потоков.
Работа через XHE Manager
Re: Работа через XHE Manager
Тут, менеджер ни при чем. Менеджер, действительно, управляет(в теории) потоками ХНЕ.
А то, о чем говорите вы - совместный доступ потоков к данным.
Как вариант можно избежать этой сложности совсем - поделить исходный фал на куски и каждому потоку отдать его "кусок".
Либо читать исходный файл и сразу удалять строку, с которой будет работать копия. Тут и при записи результата понадобится http://au2.php.net/flock
А то, о чем говорите вы - совместный доступ потоков к данным.
Как вариант можно избежать этой сложности совсем - поделить исходный фал на куски и каждому потоку отдать его "кусок".
Либо читать исходный файл и сразу удалять строку, с которой будет работать копия. Тут и при записи результата понадобится http://au2.php.net/flock
Re: Работа через XHE Manager
Да, я имею ввиду про совместный доступ. Вариант с делением файлов на куски не подходит. Второй вариант с блокировкой тоже не подходит, у меня все действия в цикле, если ставить flock, то какой смысл в многопоточности если каждый поток будет ждать отключения блокировки.
Можно как-то задать глобальную переменную, повесить ее на счетчик и передать в качестве аргумента в менеджере потока?
Возьмем для примера простой цикл:
Как задать аргумент чтобы каждый поток брал строку со своим номером $i? Не совсем понимаю как это делается на XHE, ведь тут каждый поток это отдельная копия, у каждой копии свой счетчик и тд и тп. На дескопе это реализуется простой критической секцией.
Можно как-то задать глобальную переменную, повесить ее на счетчик и передать в качестве аргумента в менеджере потока?
Возьмем для примера простой цикл:
Код: Выделить всё
$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);
Re: Работа через XHE Manager
Не пойму зачем ждать полного окончания цикла.nikson писал(а):Второй вариант с блокировкой тоже не подходит, у меня все действия в цикле, если ставить flock, то какой смысл в многопоточности если каждый поток будет ждать отключения блокировки.
Я бы сделал так:
Копия пытается открыть файл для чтения/записпи. Если нет флока - ставит, читает файл, выдергивает из массива строку, перезаписывает файл массивом уже без строки, отключает флок и дальше делает что надо. Секунда делов:)
Re: Работа через XHE Manager
Как это будет выглядеть на примере выложенного мною выше цикла? Или все только на словах сделали бы?
Re: Работа через XHE Manager
Может еще пожевать?
Вы правы, в этом случае будет на словах.
Вы правы, в этом случае будет на словах.
Re: Работа через XHE Manager
Это я к тому что ваш способ с блокировкой в цикле не уместен, поэтому примера вы привести не сможете. Когда не знаешь лучше промолчать, чем городить ахинею.Germ писал(а):Может еще пожевать?
Вы правы, в этом случае будет на словах.
Re: Работа через XHE Manager
Вы ошибаетесь, этот способ есть, он работает, и да, он уместен:)
ЗЫ:
Ну или более конкретно: Когда просишь помощи - хамить не помогает.
Удачи;)
ЗЫ:
Золотые слова!nikson писал(а):Когда не знаешь лучше промолчать, чем городить ахинею
Ну или более конкретно: Когда просишь помощи - хамить не помогает.
Удачи;)
Re: Работа через XHE Manager
Извиняюсь, возможно неправильно выразился, но хамить я не хотел.
Но ваш способ все равно неуместен, неуместен именно в XHE. Смысл этой блокировки, ведь в XHE потоки это копии, пусть даже я включу блокировку но это ничего не изменит, так как нельзя задать глобальную переменную в менеджере потоков, от чего потоки будут отталкиваться делая перезапись массива, ведь у каждого потока свой массив и своя локальная переменная.
Если только как вариант попробовать сразу удалять строку, тогда и переменная не понадобиться...
Но ваш способ все равно неуместен, неуместен именно в XHE. Смысл этой блокировки, ведь в XHE потоки это копии, пусть даже я включу блокировку но это ничего не изменит, так как нельзя задать глобальную переменную в менеджере потоков, от чего потоки будут отталкиваться делая перезапись массива, ведь у каждого потока свой массив и своя локальная переменная.
Если только как вариант попробовать сразу удалять строку, тогда и переменная не понадобиться...