- Регистрация
- 23.12.2014
- Сообщения
- 14 419
- Благодарностей
- 5 454
- Баллы
- 113
IZennoList accounts = project.Lists["accounts"];
Random rnd = new Random();
string accStr;
string[] data;
if(accounts.Count == 0)
{
throw new Exception();
}
lock(SyncObjects.ListSyncer)
{
System.Threading.Thread.Sleep(175);
int index = rnd.Next(0, accounts.Count);
accStr = project.Variables["accStr"].Value = accounts[index];
data = accStr.Split('|');
accounts.RemoveAt(index);
System.Threading.Thread.Sleep(175);
}
вроде норм
Ну кроме проверки на 0 строк за пределами лока вроде косяков нет. Хз, что бочит у тебя. Глобальный изолированный тест пробовал проводить?С таким кодом без пауз у меня потоки хватали одинаковые строки. Так что, смотри сам.
Список, естественно, привязан к файлу. Возможно, проблема именно из-за IZennoList.C#:IZennoList accounts = project.Lists["accounts"]; Random rnd = new Random(); string accStr; string[] data; if(accounts.Count == 0) { throw new Exception(); } lock(SyncObjects.ListSyncer) { System.Threading.Thread.Sleep(175); int index = rnd.Next(0, accounts.Count); accStr = project.Variables["accStr"].Value = accounts[index]; data = accStr.Split('|'); accounts.RemoveAt(index); System.Threading.Thread.Sleep(175); }
Даже не в курсе как лучше привязатся к списку.Список, естественно, привязан к файлу. Возможно, проблема именно из-за IZennoList
А что с ними?Ну кроме проверки на 0 строк
Она (проверка) вне локаА что с ними?
запускаем твой код в 100 потоков. все потоки пролетят до лока показав что в списке например 50 строк, после по очереди у тебя отработает каждый поток норм пока в списке находятся строки, но потоки в ожидании, они уже проверку на пустоту списка прошли, и остальные 50 потоков просто с пустым списком будет работать, и паузы в локе не спасут, до лока потоки залетят быстрее чем первый выйдетС таким кодом без пауз у меня потоки хватали одинаковые строки. Так что, смотри сам.
Список, естественно, привязан к файлу. Возможно, проблема именно из-за IZennoList.C#:IZennoList accounts = project.Lists["accounts"]; Random rnd = new Random(); string accStr; string[] data; if(accounts.Count == 0) { throw new Exception(); } lock(SyncObjects.ListSyncer) { System.Threading.Thread.Sleep(175); int index = rnd.Next(0, accounts.Count); accStr = project.Variables["accStr"].Value = accounts[index]; data = accStr.Split('|'); accounts.RemoveAt(index); System.Threading.Thread.Sleep(175); }
В данном случае, меня эта проверка устраивает вне лока, она формальна, там всегда несколько тысяч строк не в работе.Ну кроме проверки на 0 строк за пределами лока вроде косяков нет.
Не понимаю о чём речь. Как это сделать?Глобальный изолированный тест пробовал проводить?
Не, Я понимаю эту логику, но, в данном случае, такой ситуации не возникнет, выше написал. Строк несколько тысяч, потоков менее 100.запускаем твой код в 100 потоков. все потоки пролетят до лока показав что в списке например 50 строк, после по очереди у тебя отработает каждый поток норм пока в списке находятся строки, но потоки в ожидании, они уже проверку на пустоту списка прошли, и остальные 50 потоков просто с пустым списком будет работать, и паузы в локе не спасут, до лока потоки залетят быстрее чем первый выйдет
Сделай отдельный шаблон с подобным кодом. Безбраузерный для максимальной скорости. Там внутри пусть будет два списка. Скажем input и output. Первый заполненный, скажем, на 1кк уникальных строк, второй пустой. Оба привязаны к файлам, важно, чтобы больше нигде эти файлы не фигурировали. В самом шаблоне код, подобный твоему. В локе сгенерировали рандомный индекс, строку с ним взяли, строку с ним удалил. Эту строку положили во второй список. И запустить шаб в 1000 потоков на миллион выполнений. Когда шаб отработает и пройдёт достаточно времени для синхронизации - почистить дубли во втором списке. Если после чистки будет меньше 1кк записей - да, где-то есть бок на уровне зеннопостера. И такой шаб я бы исследовал и тоже постестил.Не понимаю о чём речь. Как это сделать?
Thread.Sleep(Global.Classes.rnd.Next(100, 200));
IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями
int count = 2;
for (int i = 0; i < count; i++)
{
string url = string.Empty;
lock (SyncObjects.ListSyncer)
{
if (GeneralList.Count > 0)
{
url = GeneralList[0];
GeneralList.RemoveAt(0);
return url;
}
}
System.Threading.Thread.Sleep(1 * 500);
}
throw new Exception("");
var List1 = project.Lists["GENERAL-LIST"];
var url2 = project.Variables["ID"].Value;
lock(SyncObjects.ListSyncer)
{
if (url2 != "")
{
List1.Add(url2);
return "Ok";
}
}
это как ?Вот мы сделали чтение
Код:Thread.Sleep(Global.Classes.rnd.Next(100, 200)); IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями int count = 2; for (int i = 0; i < count; i++) { string url = string.Empty; lock (SyncObjects.ListSyncer) { if (GeneralList.Count > 0) { url = GeneralList[0]; GeneralList.RemoveAt(0); return url; } } System.Threading.Thread.Sleep(1 * 500); } throw new Exception("");
А запись у меня такая, и что интересно привязка к листу другая совсем. Это может быть проблемой? Какие ошибки в коде есть?
C#:var List1 = project.Lists["GENERAL-LIST"]; var url2 = project.Variables["ID"].Value; lock(SyncObjects.ListSyncer) { if (url2 != "") { List1.Add(url2); return "Ok"; } }
такая же. Просто в первом случае ты явно указал тип, во втором не указывал, но он подхватится сам из присваиваемого значенияи что интересно привязка к листу другая совсем
Купи SSD, скажешь потом спасибо. Они сейчас стоят вполне адекватно.
Он у меня есть, на нём система и софт.Купи SSD, скажешь потом спасибо. Они сейчас стоят вполне адекватно.
Тестанул бы на SSD.Он у меня есть, на нём система и софт.
IZennoList list1 = project.Lists["temp"];
list1.Bind(project.Path+"accs.txt");
lock(SyncObjects.ListSyncer){
project.Variables["acc"].Value = list1.GetItem("random",true);
}
IZennoList list1 = project.Lists["temp"];
list1.Bind(project.Path+"accs.txt");
lock(SyncObjects.ListSyncer){
list1.Add(project.Variables["acc"].Value);
}
Скорость записи чтения какая?Ну что, решили как бороться с этим?
У меня 2 разных шаба работают с одним файлом через список одновременно.
Оба шаблону берут строки и записывают их обратно.
Идёт утечка акков и записывание дублей.
Уже выше кидал снипеты, скину еще раз.Ну что, решили как бороться с этим?
var List1 = project.Lists["GENERAL-LIST"];
var url2 = project.Variables["ID"].Value;
lock(SyncObjects.ListSyncer)
{
if (url2 != "")
{
List1.Add(url2);
return "Ok";
}
}
Thread.Sleep(Global.Classes.rnd.Next(100, 200));
IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями
int count = 2;
for (int i = 0; i < count; i++)
{
string url = string.Empty;
lock (SyncObjects.ListSyncer)
{
if (GeneralList.Count > 0)
{
url = GeneralList[0];
GeneralList.RemoveAt(0);
return url;
}
}
System.Threading.Thread.Sleep(1 * 500);
}
throw new Exception("");
Никаких танцев нету. Обычная логика PM на кубах.Зачем все эти танцы с бубном (списком)
Да это понятно. Я просто для своих шаблонов давно отказался от зенно списков и таблиц. Все перевел на MySQL и ни разу об этом не пожалел. Тут хоть 10 шабов могут одновременно писать/читать таблицу и все будет ok, а при зависании постера никакие данные из таблиц не пропадут. Ну и плюсом идет вся мощь языка запросов SQL.Никаких танцев нету. Обычная логика PM на кубах.
Окей@sydoow
Я не уверен на 100% что оно не пропускает дубли и прочее. Если есть у тебя желание, можешь проверить и сообщить результат. Но самое простое решение таких проблем это добавить в лок паузу.
Да это понятно что БД - это топ варик, но для этого БД нужно немного подучитьДа это понятно. Я просто для своих шаблонов давно отказался от зенно списков и таблиц. Все перевел на MySQL и ни разу об этом не пожалел. Тут хоть 10 шабов могут одновременно писать/читать таблицу и все будет ok, а при зависании постера никакие данные из таблиц не пропадут. Ну и плюсом идет вся мощь языка запросов SQL.
Впрочем, если шаблон делается для дальнейшей продажи, то возможно БД не самый лучший вариант т.к для клиента установка того же OpenServer это доп. гемор
Да, без этого не обойтись. Но, равно или поздно все равно упрешься в слабые места файлов и тут уже будет без вариантов. У меня это случилось когда нужно было работать со списком в десяток миллионов строк ... зенна со стандартным списком умерла не приходя в сознание А для MySQL это вообще не проблема!Да это понятно что БД - это топ варик, но для этого БД нужно немного подучить