[SOLVED] Появление дублей в Блеклисте при многопотоке

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113
Привет всем! Подобные решения есть на форуме, но до конца они решили моей проблемы.

Что есть:
1. Есть список (не привязанный к файлу) в котором хранятся распаршенные IDs юзеров
2. Есть список блеклист (привязанный к файлу) в котором хранятся уже заюзанные IDs юзеров.

Какие действия совершаются:
1. Берётся IDs нового юзера из списка.
2. Берётся весь текст из блеклиста
3. Regex(ом) проверяется есть ли наличие нового IDs в блеклисте
4. Если есть, берём новый, если нет, то совершаем действие и заносим в блеклист.

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

Как я понимаю, нужно перевести всё в C# и залочить файл перед записью. Как это сделать я не знаю. Подскажите, мне, пожалуйста готовый сниппет для решения этой задачи.
Спасибо!
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 481
Благодарностей
8 692
Баллы
113
2. Есть блеклист (привязанный к файлу) в котором хранятся уже заюзанные IDs юзеров.
это тоже список?
если нет, то нужно тоже оперировать со списком..
думаю, что проблема исчезнет..
можно будет чистить на дубли, но даже и с дублями проблем с идентификацией ID в черном спсике не должно возникнуть..
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113
это тоже список?
если нет, то нужно тоже оперировать со списком..
думаю, что проблема исчезнет..
можно будет чистить на дубли, но даже и с дублями проблем с идентификацией ID в черном спсике не должно возникнуть..
да, это список привязанный к файлу.
в фрагменте проекта два списка.
один привязанный к файлу (блеклист)
второй в самом проекте
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 481
Благодарностей
8 692
Баллы
113
Могу выложить фрагмент шаблона для упрощения решения =)
да, так в любом случае будет проще понять где возникает проблема..
не обещаю, что именно я возьмусь, но может кто то еще подключится..
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113
ну да соглашусь и именно со второй строкой )
:D

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

Да, сейчас выгружу.
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113
Вот ссылка на фрагмент шаблона
Блок с блеклистом я выделил.
 

Вложения

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113
Вот похожий код, который нашёл для реализации моей задачи, но он не делает то, что нужно

C#:
List<string> bad = project.Lists["Черный лист"].ToList(); //Черный лист
List<string> mix = project.Lists["Список для рассылки"].ToList(); //Список, в котором нужно отсеить
var good =project.Lists["Чистые ID"]; //Спискок, уже с "чистыми" id
List<string> kostyl = new List<string>(); //важный элемент индусского кода
//блок очень сложного индусского кода
kostyl=mix.Except(bad).ToList();
foreach(string data in kostyl)
{good.Add(data);}
List<string> bad = project.Lists["Черный лист"].ToList(); // Строка подходит
List<string> mix = project.Lists["Список для рассылки"].ToList(); //Эта не подходит. Нужно, чтобы здесь была переменная со значением из списка с IDs новых юзеров
var good =project.Lists["Чистые ID"]; // Тут тоже должна быть переменная с уже проведённым вычитанием
// Вычитание
kostyl=mix.Except(bad).ToList(); // Строка подходит
foreach(string data in kostyl) // Строка подходит
{good.Add(data);} //

Как я понимаю нужно примерно так:

C#:
List<string> bad = project.Lists["blacklist"].ToList(); //Блеклист
Variable<string> mix = project.Variable["profile_id"].Value(); //Переменная, которую нужно проверить на совпадение с блеклистом
var good =project.Variable["blacklisted"].Value(); //Переменная, уже с "чистыми" id
Variable<string> kostyl = new List<string>(); //важный элемент индусского кода
//блок очень сложного индусского кода
kostyl=mix.Except(bad).ToList();
foreach(string data in kostyl)
{good.Add(data);}
Помогите подправить код)
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113
Урааааа! Нашёл код, работает, но надо тестить на много потоке буду пробовать!
Код ищет строчку в файле из переменной. Если находит, то возвращает результат.


C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["add_friend_profile"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["blacklist_added_to_friend_profiles"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
            return "yes";
    }
}
// если ничего не нашли возвращаем "no"
return "no";
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113

1977_Alex_2016

Пользователь
Регистрация
15.12.2016
Сообщения
32
Благодарностей
3
Баллы
18

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с 1977_Alex_2016 какие-либо сделки.

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

Через глобальную переменную думал, но это мне нужно будет сменить логику проекта, что не очень подходит.

Если лочить файл перед чтением и записью, поможет?
удаление только, так как каждый поток начинает с нуля и поэтому или удалять или глобалка
 
  • Спасибо
Реакции: Meteorburn

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113
удаление только, так как каждый поток начинает с нуля и поэтому или удалять или глобалка
Ну да, идея с общим списком хорошая и наверно более оптимальная, чем нынешняя, когда каждый поток берёт одни и те же значения и потом сверяет их с блеклистом.
Но плохо то, что теперь придётся предыдущие действия менять, которые идут при формировании списков.

А можно ли как-то инициализировать глобальный список в зенно? Без привязки к файлу?
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 448
Благодарностей
564
Баллы
113
Всем спасибо, кто ответил в теме!
И отдельное спасибо 1977_Alex_2016

Реализовал через глобальные переменные и список с удалением. Всё работает, одинаковые профили шаблон не добавляет и дублей в блеклисте нет!
ZennoPoster Pro v5.9.9.1 by ZennoLab.com.png
 

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