Вопрос по многопотоку в ZENNO POSTER

zios

Client
Регистрация
29.01.2016
Сообщения
306
Благодарностей
9
Баллы
18
Всем привет! Ребята подскажите пожалуйста ..есть ли возможность при рассылке сообщений в 5 потоков, сохранять айди юзеров с каждого потока в отдельный файл , что бы потом повторно по ним пройтись имеено с того аккаунта с которого рассылал прежде ? Очень нужен именно такой вариант ....
 
Последнее редактирование:

ex3maL

Client
Регистрация
22.05.2020
Сообщения
359
Благодарностей
267
Баллы
63
конечно есть, юзай таблицы или БД
записывай ид юзеров и с какого акка отправка была и все.
 

zios

Client
Регистрация
29.01.2016
Сообщения
306
Благодарностей
9
Баллы
18
можете пожалуйста более подробно объяснить ...я никогда так не делал
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113

zios

Client
Регистрация
29.01.2016
Сообщения
306
Благодарностей
9
Баллы
18

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
данные в список записывал , но вот как это сделать на 5 аков сразу ..вот в чем вопрос
Берете и записываете в список, многопоток это не какой-то чудо режим. Это просто дублирование задачи.
Возможно вы говорите про то, что одновременно два потока могут взять в работу один ID. В таком случае надо лочить список на запись, чтение + проверку на блеклист. Если порытся по форуму то можно найти примеры.
 

zios

Client
Регистрация
29.01.2016
Сообщения
306
Благодарностей
9
Баллы
18
вопрос немного другой ....как сделать так что бы каждый поток брал уникальный айди и потом его записывал в отдельный файл ...5 потоков 5 файлов ..и потом прогнать что бы каждый ак работал только со своим списком айди
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
каждый поток брал уникальный айди
Взять из списка с удалением.

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

zios

Client
Регистрация
29.01.2016
Сообщения
306
Благодарностей
9
Баллы
18
Взять из списка с удалением.


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


Тут уже сложнее. С многозадачностью у зенки проблемы. Можно создавать списки, название списка будет логин от аккаунта. Таким образом каждый поток будет обращатся к данному списку и производить с ним необходимые операции.
как такое можно сделать , подскажите пожалуйста ...
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 454
Баллы
113
Всем привет! Ребята подскажите пожалуйста ..есть ли возможность при рассылке сообщений в 5 потоков, сохранять айди юзеров с каждого потока в отдельный файл , что бы потом повторно по ним пройтись имеено с того аккаунта с которого рассылал прежде ? Очень нужен именно такой вариант ....
Количество потоков = количеству потоков установленных в Зеннопостере.
78412

Если поставить 100 - то шаблон должен выполняться в 100 потоков одновременно.

Пример реализации данной задачи:
IZennoList profiles = project.Lists["profiles"]; // Допустим у нас есть список профилей/аккаунтов с которого ведётся рассылка
IZennoList ids = project.Lists["ids"]; // Допустим, у нас есть список ID по которым необходимо провести рассылку
IZennoList queue = project.Lists["queue"]; // Список для хранения данных в виде id|profile

if(profiles.Count == 0) { // Если данных нет - добавляю демо данные
    lock(SyncObjects.ListSyncer) { // обеспечиваю добавление данных в многопотоке
        profiles.Add("profile_1"); // заполняю демо данными
        profiles.Add("profile_2");
        profiles.Add("profile_3");
    }
}

if(ids.Count == 0) { // Если данных нет - добавляю демо данные
    lock(SyncObjects.ListSyncer) { // обеспечиваю добавление данных в многопотоке
        ids.Add("00001"); // заполняю демо данными
        ids.Add("00010");
        ids.Add("00100");
        ids.Add("01000");
        ids.Add("10000");
    }
}

// Получаю строчку с ИД, с которого необходимо выполнить какую-то работу
string id = string.Empty;
lock(SyncObjects.ListSyncer){
    if(ids.Count > 0) {
        id = ids.GetItem("0", true); //  Получаем первую строчку с удалением, чтобы одновременно несколько потоков не могли работать с одним ид
    }
}
if(string.IsNullOrEmpty(id)) {
    // профиль не возвращаем - ещё не брали
    // ид не возвращаем - он пустой
    throw new Exception("Пустой ID");
}

string profile = string.Empty;
if(queue.Count >0 ) {
    string[] temp_queue = queue.Where(x=> x.Split('|')[0] == id).Select(x=>x.Split('|')[1]).ToArray(); // получаем профиль, с которого уже производилась рассылка на этот ид
    profile = temp_queue.Length > 0 ? temp_queue[0] : string.Empty;
}
if(string.IsNullOrEmpty(profile)){ // На этот ИД ещё не производилась рассылка - берем новый профиль
    lock(SyncObjects.ListSyncer){
        if(profiles.Count > 0) {
            profile = profiles.GetItem("0", true); //  Получаем первую строчку с удалением, чтобы одновременно несколько потоков не могли работать с одним профилем
        }
    }
}
else {
    // на этот ИД уже производилась рассылка с профиля - используем этот профиль, он уже в переменной
    // Необходимо удалить его из списка, чтобы другой поток не начал работу с ним
    lock(SyncObjects.ListSyncer){
        string[] temp_profiles = profiles.Where(x=> x!= profile).ToArray();
        profiles.Clear();
        if(temp_profiles.Length > 0) profiles.AddRange(temp_profiles);
    }
}

if(string.IsNullOrEmpty(profile)){
    if(!string.IsNullOrEmpty(id)) ids.Add(id); // Возвращаем ИД обратно
    // профиль не возвращаем - он пустой
    throw new Exception("Вернули ИД обратно - нет профиля для работы");
}

// В результате, в нас есть подготовлен ИД и профиль, с которых будем производить рассылку
// Где-то здесь производим рассылку
project.SendInfoToLog(string.Format("Сделали рассылку на ID: {0} профиль: {1}", id, profile),true);

// Добавили в список связку ИД, профиль, чтобы при следующем обращении использовать этот же профиль
lock(SyncObjects.ListSyncer){
    queue.Add(string.Join("|", new[]{id, profile}));
}
// Вернули назад профиль
lock(SyncObjects.ListSyncer){
    profiles.Add(profile);
}
// Вернули назад ид
lock(SyncObjects.ListSyncer){
    ids.Add(id);
}

// Также по количеству добавлений можем узнать сколько раз была произведена отправка на определенный ИД
project.SendInfoToLog(string.Format(@"На id: {0} производилась рассылка: {1} раз", id, queue.Where(x=> x.Split('|')[0] == id).Count()), true);

// Нужно быть аккуратным, так как файл списка будет расти
// Если с какими-то ид больше работать не предполагается, необходимо удалять их из списка, либо работать точно также с базой данных
вопрос немного другой ....как сделать так что бы каждый поток брал уникальный айди и потом его записывал в отдельный файл ...5 потоков 5 файлов ..и потом прогнать что бы каждый ак работал только со своим списком айди
А что касается этого - то дело в том, что при запуске шаблона Зеннопостер запускает поток, что-то вроде new Task(() => {//code}) и он хранит ИД этого потока только до момента завершения. Как только поток завершил работу, Зенно "забывает" о том, что он вообще существовал. Более того, Зенно не может запустить поток с определенным ID (так как его назначает операционная система).
Другими словами, не стоит вообще заморачиваться о том, какой именно поток с каким именно ID будет выполнять Вашу задачу. Вам должно быть важно, что одновременно Зеннопостер должен выполнять например 5 задач, и для этого он должен запустить 5 потоков.
И уже внутри самой задачи логика должна быть построена так, чтобы потоки Зеннопостера не могли одновременно работать с теми же данными (как люди выше писали - брать с удалением, блокировать списки перед взятием/добавлением данных).

Заморочиться конечно можно, и сохранять 5 файлов, и потом обрабатывать данные относительно этих файлов. Но, мне кажется, что для решения поставленной Вами задачи нет нужды работать ещё с какими-то дополнительными файлами (либо задача раскрыта не полностью).
 
Последнее редактирование:

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
Все просто, потом привязываешь к файлу, если его нет создать, и потом туда вписать данные. Вообще идеальный вариант с базой sqlite.db. У меня нет знаний работы с базой, по этому для меня вариант, самый подходящий как Михаил предложил.
1623060571780.png
 
  • Спасибо
Реакции: zios

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 454
Баллы
113
Вообще идеальный вариант с базой sqlite.db.
Хм...
В многопотоке...
SQLite идеальный вариант...?
Можно как-то безопасно без локов записывать данные в SQLite например в 50 потоков одновременно?
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
Хм...
В многопотоке...
SQLite идеальный вариант...?
Можно как-то безопасно без локов записывать данные в SQLite например в 50 потоков одновременно?
Почему без локов?)
Я написал что для меня идеальный вариант.
 

zios

Client
Регистрация
29.01.2016
Сообщения
306
Благодарностей
9
Баллы
18
ребята сейчас запустил проект максимум потоков 5 установил , делать 1 раз. Зенно у меня в 1 поток хреначит. пострел загрузку компа процессор 24% памяти 69% ....почему в 1 поток работает ....можете подсказать?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
ребята сейчас запустил проект максимум потоков 5 установил , делать 1 раз. Зенно у меня в 1 поток хреначит. пострел загрузку компа процессор 24% памяти 69% ....почему в 1 поток работает ....можете подсказать?
и какие у тебя настройки в зеннопостере ? лучше приведи скрин всего экрана.
 

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