Потоки какие то не такие...

  • Автор темы Автор темы nomarketing
  • Дата начала Дата начала

nomarketing

Client
Регистрация
01.11.2013
Сообщения
913
Реакции
179
Баллы
43
Вообщем, странно, но я держу пока что кувалду на изоленте под сталом :D
Вообщем проблема с потоками,
Описание:
1.Переход на страницу,
2.Паршу ссылки
3.Заношу ссылки в лист
4.Финиш
5.Заношу спаршенные ссылки в файл.

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

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

Но я же не буду за ними как за детьми присматривать и запускать их в двери по очереди,

Почему они сами не знают кто за кем и вообще шо за дела такие вот хм, я расстроен очень. :)

Ну кто вообщем в курсе событий как справится с учениками пишите, либо дайте мне каких то примерный учеников на своем примере а я скачаю и потестю их на воспитание и интелект.
 
Вообщем что я сделал перед тем как идти спать помыл ноги, но тут пришла в голову мысль, просто щас в нее ничего не приходит так как спал часа 2 от силы за посленюю неделю.
Так вот, я вставил сообщение счетчика, что бы при потоках вылетал алерт с нумерацией, так вот велатет в таком поряде 0 0 1 1 2 2 3 3 и как это понять ?
Вообщем жду судей гонщиков и котов.
 
По описанию трудно что-то с ванговать, покажите шаблон.
 
Вообщем я понял из за чего это но не понял почему так и как этого избежать ? :-)
Вообщем это все их за метода GET - парсинга сурса. Если его бурать то циклы идут как надо, если он есть, то к примеру два цикла будут парсить поочереди начиная с начала, т.е

0,0,1,1 вообщем увидите в зенке по алертам резальт.

Вылаживаю пример.
 
Ага вылажил пример, люди как тут файл то прикрепить ?...
 
1.Переход на страницу,
2.Паршу ссылки
3.Заношу ссылки в лист
4.Финиш
5.Заношу спаршенные ссылки в файл.

Нужно просто добавить список, указать в его свойствах путь к файлу, поставить галки "загружать из файла" и "сохранять изменения".
И добавлять в список строки, использовать экшены сохранения в файл не нужно
 
Нужно просто добавить список, указать в его свойствах путь к файлу, поставить галки "загружать из файла" и "сохранять изменения".
И добавлять в список строки, использовать экшены сохранения в файл не нужно
Я все так и делал, и делал по разному :) но понял что проблема то не в этом, а в том что я написал выше.
Скачайте проэкт и запустите 2 потока и увидете что отображает счетчик.
Если в нормальных потоках идет 0,1,2,3 и т д , то в этом простейшом примере, с get запросом, идет все в порядке, 0,0, 1,1 т.е т.е два потока работают как один получается, т.е второй поток изначально не увеличен на +1.
Вообещем скачайте запустите увидите..
 
Так так и должно быть. у вас не глобальные переменные
 
Так так и должно быть. у вас не глобальные переменные
Так не чесно.
В том плане что я не знаю что там делать с глобальными переменными кот тоже не знает.
Как решить ? что там прописывать ?
 
Спасибо, переделал, счетчик показывает вроде без повторений, но, сделал я привязку к файлу, как и говорилось, все равно повторяются данные раз или два а может и три раза в файле..
Т.е как бы на счетчике такого не видно типа 0 0 1 1 , а вот в самом файле, 2-3 раза по дному и тому же урлу парсилось.. т.е какие то 2-3 цикла парсили одну и туже старницу получается.. как то так
 
Ага, или вот что еще, вроде с 2-3 раза решил проблему, если 2 цикла, то... к примеру в конце постинга есть алерт на выход FINISH.
Так вот в конце когда достигнут лимит парсинга, идем на выход, и обьявляем алерт.
Так мне вылетают в конце два FINISH. т.е последний поток записывает данные, ииии... тут на тебе второй потом тоже их записывает в итоге если делать в два потока то и будет двойная запись в конце....
Как этого избежать ?
 
Извините конечно... но у вас какая то ошибка в логике шаблона, это я могу вам совершенно точно сказать. Если я даю список на 10 000 строк в 50 потоков, то на выходе я тоже получаю 10 000 строк, а исходя из ваших описаний должно быть хотя бы 10001.
Сложно искать в черной комнате черного котика, когда его там нет.
 
Извините конечно... но у вас какая то ошибка в логике шаблона, это я могу вам совершенно точно сказать. Если я даю список на 10 000 строк в 50 потоков, то на выходе я тоже получаю 10 000 строк, а исходя из ваших описаний должно быть хотя бы 10001.
Сложно искать в черной комнате черного котика, когда его там нет.
кОТ, на глянь, бо я уже не могу я на одном месте уже часа 2 топчусь не могу понять что там не так..
Вообщем гляньте логику..

Сам файл : http://dropcanvas.com/lfa19/1
 
"{-GlobalVariable.Poster.taskPos-}" == "{-Variable.page_limit-}"
тут кавычек не должно быть
в остальном вроде норм
 
Ну вообщем странно как то, все получает проблема в стыковке завершение... это лично что я понял остоточно без сомнений проверив пицот раз и коту показал два раза на что он одобрил.
Так вот.
Если я ставлю 3 потока, лимит определен, и вылетает три алерта FINISH WORK.
Т.е получается 3 лишних раза записывает в файл последние 3 страницы..
Если ставлю 4 потока, то 4 раза будет выход на финиш идти.
Вот не пойму как этого избежать я уже глобальную переменную сделал Pagelimit но все тоже самое.
Т.е если из 3 потоков один заходит на финиш, то остальные 2 должны как то отсановится или ну не знаю... (вот тут вообще то и вся проблема) а они продолжают и тоже заходят на финиш в итоге 3
Пишет 1,2,3 финиш.. ну надеюсь понятно что я тут написал - но не могу понять как избежать такой проблемы, ну кроме того что по звершению всего, открывать удалять дубли и сохранять..
 
Вообщем ясно, парсить ссылки можно только в один поток.
Просто я уже все перепробывал все методы сохранение данных и так далее, един метод работает это в один поток при чем по разным логическим методам, и методам сохранение.
Именно ссылки, с постингом проблем нет так как там эти переменные не учавствуют а идет привязка по файлу.. но тут.. это анреал какойто.
Можно обойтись даже одним потоком на костылях за то идем, но я из принципа хочу добить этот многопоточный парсинг линков, именно многопоточно !
Но видать тут никаму нет дела, понимаю у всех свои проблемы проэкты но привидете хотя бы мааааленький пример такого парсинга, с многопотоком. рабочий.
Что бы можно было понять где у меня в логике ошибка, хотя ошибку вверху гонщик не признал вроде. Ну тогда где проблема то ?
 
Вообщем, не решил я не чего но не здался.. применять удалять дубли все равно пришлось, так как я понял проблема в распределении потоков и не связки логики их распределение.. вообщем заманил я их в клетку и удалил близнецов :D Просто иначе ну не знаю для меня бы было что то сверх естесвенное если бы мне щас показали рабочий пример... без применение дублей с разной вариацией потоков и что бы задал парсить 5 страниц, задал к ним 3 потока, и вышло тебе 50 урлов. Аа.. не тут то было.. :) либо поток хитрец лезет не всвое стойло, либо хитрицы одновременно начинают с одного стойла, либо сумарное количество близнецов в конце думают что они последние :D как никрути выход один - применять дубли :aq: ха ха
 
Посмотрел я ваш проект - косяк в том, что вы считаете что между проверкой значения и изменением того значения проходит 1 такт))) но это не так)))
Для того, чтобы все было ок нужно использовать 1 элемент, где семафоры реализованы по умолчанию - это списки. Отвязывайтесь от глобальных переменных и привязывайтесь к единому списку задания и все будет ок
 
  • Спасибо
Реакции: nomarketing
Посмотрел я ваш проект - косяк в том, что вы считаете что между проверкой значения и изменением того значения проходит 1 такт))) но это не так)))
Для того, чтобы все было ок нужно использовать 1 элемент, где семафоры реализованы по умолчанию - это списки. Отвязывайтесь от глобальных переменных и привязывайтесь к единому списку задания и все будет ок
А можно примерчик, а то что то не могу обработать нормально информацию вами отправленную.. что бы разложить ее в програмном правильном логическом виде. :-)
А с маленьким примерчиком будет наглядно и понятно, а может кому то еще и полезно :-)

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

Мааааааленький такой примерчиккк :-)

Спасибо :-)
 
я бы сделал так - сохраняйте в файл список значений переменной, которая изменяется при парсинге, и из него уже можно многопоточно брать, и проблем не будет
не совсем правильно, если в переменной простой счетчик, но хотя бы работает
 
вот пример
 

Вложения

  • 123.zip
    123.zip
    18,6 KB · Просмотры: 9
  • Спасибо
Реакции: nomarketing
Спасибо, что то для меня новенькое, тем более я думал что все можно решить без стороннего кода, а как оказалось он там присуцтвует хоть и не большой, и пока мне не понятные кроме алерта который показывает изменение.
С такой логикой не сталкивался еще .. буду рабиратся как это она так работает и что за код.
 
Да этот код просто прибавляет 30 к первоначальному числу)))))) я не знаю яваскрипта, поэтому выкручиваюсь как могу)))
Но в любом случае его наличие и суть никак не влияют на логику работы с одним источником данных в несколько потоков
 
  • Спасибо
Реакции: nomarketing
Да этот код просто прибавляет 30 к первоначальному числу)))))) я не знаю яваскрипта, поэтому выкручиваюсь как могу)))
Но в любом случае его наличие и суть никак не влияют на логику работы с одним источником данных в несколько потоков
Так а почему число берется из списка 123.txt ? а не из счетчика ?..
Т.е в моем понимании парсинг работал по такой логике -
Устанавливаем счетчик
подставляем счетчик в гет запрос,
проверяем лимит,
Увеличиваем счетчик
Если достигнут лимит
Выход..
 
А я логику вашего парсера вообще не понимал)))
какая перменная, какой лимит?))) что парсим то?))
 
Ну к примеру мне надо спарсить с 20 страниц линки на новости.
Значение счетчика подставляется в гет запрос, после чего полчаем сурс, из сурса, регуляркой все линки ложим в список, и переходим на 2 страницу.
Т.е счетчик это указатель страниц, если счетчик 2 то и страница будет 2 с которой будем парсить.
А у вас логика просто но мне не понятна.. т.е не понятно как ее можно применить при парсинге.. и зачем там тот тестовый файл ? с цифрами.. (т.е к моей логике парсинга это не применимо) ибо я не пойму как оно работает и как это можно применить
 
К примеру зачем там список ?
В моем парсинге список изначально пусть, а только потом заполняется спаршенными данными, у вас список применяется .. изначально что уже не подходит по логике как бы..
 
Ощем ясно ходить по кругу в в качестве зеннопостера по форуму утомился :)
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)