не работает перемещение файла(профиля) в многопотоке

fortaran

Client
Регистрация
22.04.2020
Сообщения
32
Благодарностей
1
Баллы
8
Добрый день профи. столкнулся с ситуацией что зенка в многопоке не хочет перемещать файл. в однопотоке все работает хорошо.
опишу систему работы.
работа с аккаунтами в соцсети. к каждому аку привязан свой профиль.
название профиля соответствует логину чтобы не запутаться
внутри проекта есть папка profiles в ней 1)gotovi k rabote 2)v rabote (когда аккаунт вступает в работу он переноситься во временную папку чтобы его не хватанул другой поток)
есть таблица "accaunti" с которой проект определяет какой профиль брать
столбец А - название профиля.zpprofile
столбец B - unix time когда профилю пора в работу

смысл работы:
1) шаблон сортирует таблицу "accaunti" по минимальному столбцу B чтобы понять по unixtime кто дольше всех не работал
2)из этой строки в столбце А берем значение (название профиля) и кладем в переменную. {-Variable.accaunt_iz_tablici_sootvetstvujushiy_unixtime-}
3)загжужаем профиль. {-Project.Directory-}\profiles\gotovi k rabote\{-Variable.accaunt_iz_tablici_sootvetstvujushiy_unixtime-}.zpprofile
важно {-Variable.accaunt_iz_tablici_sootvetstvujushiy_unixtime-}={-Profile.Login-} (для удобства)
4)перемещаем профайл в папку v rabote
из {-Project.Directory-}\profiles\gotovi k rabote\{-Variable.accaunt_iz_tablici_sootvetstvujushiy_unixtime-}.zpprofile
в {-Project.Directory-}\profiles\v rabote\{-Profile.Login-}.zpprofile

дальше идем работать.

в конце проекта мне нужно вытащить аккаунт обратно из папки "v rabote" в "gotovi k rabote" и записать параметры с unixtime в стартовую таблицу "accaunti" чтобы они могли ходить по кругу.

5) я сохраняю все изменения в профиле {-Project.Directory-}\profiles\v rabote\{-Profile.Login-}.zpprofile
6) перемещаю файл из {-Project.Directory-}\profiles\v rabote\{-Profile.Login-}.zpprofile в {-Project.Directory-}\profiles\gotovi k rabote\{-Profile.Login-}.zpprofile
7) вношу изменения в стартовую таблицу accaunti {-Profile.Login-}{-String.Tab-}{-Variable.TimeUnix_v_tablicu_do_sledoyushego_zahoda-}

а теперь вопрос:
в однопотоке все работает изумительно.
но когда запускаю в многопотоке аккаунты(профиля) помещаются в папку v rabote и выполняют шаблон, но обратно не перемещаются и не заполняют таблицу для старта аккаунтов. по итоге куча аков весит в папке v rabote.
в чем может быть проблемма? шаблон ошибок не выдает, в зеннопостере все изумительно завершает работу.
версия зенки 7.2.1
прошу не пинать, а дать развернутый ответ.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
ля... фига у тебя система нипель :-) прям как у меня в одном проекте :-)

ну можно советов накидать конечно, что из них для тебя подойдет, фиг знает.
- профили как файлы лучше не трогать, это слишком затратно по времени и для диска. ну и такой метод учета подвержен как раз такой ошибке учета как ты описал.
- не увидел у тебя в описании использования методик по работе как с расписанием , а если тебе надо просто знать какой профиль не работал дольше всего, так все это излишне. просто складываешь в список профиль в конец списка, и все. Первый зашел, первый вышел :-) Конечно если надо расписание работы отрабатывать, то надо конечно улучшать. Бери пример с баз данных. Там все данные лежат сгруппированные по таблицам, а запросами формируют сложные выборки. Например в твоем случае было бы рационально иметь таблицу с аккаунтами и последним временем работы и отдельно таблицу для сложного расписания. А сводить это все в коде. С базой проще, там можно сводить запросом.
- если прям так надо что бы другие потоки не схавали повторно аккаунт, который был перезаписан в конец (а такое может быть если аккаунтов меньше чем запускаемых потоков) то можно складировать в отдельный список. в конце работы перекидывать в конец основного, но так как у тебя явно где то недоработка с логикой, то что бы они не зависали в этом файле, можно добавлять в строку таймштамп. вида логин:датазаписи , и в начале работы сначала пытаться брать в работу из этого временного хранилища, при условии что таймштамп превысил установленный таймаут, ну например 1 час. тогда у тебя при нормальной работе временный файл будет очищаться сам, а если что пойдет не так, то максимум на сколько зависнут аккаунты это установленый таймаут.
- теперь надо сказать что в последних версиях зенки не все хорошо с работой списков и таблиц. в многопотоке безопасно работать с этими элементами, только через c# и только через локирование. а я еще и паузу в конце шаблона делаю, секунд на 20, что бы все данные успели сброситься. а то прям реально не сохранялись данные записанные на последних секундах работы шаблона.
 

fortaran

Client
Регистрация
22.04.2020
Сообщения
32
Благодарностей
1
Баллы
8
Работа со списком чтобы брать первый. Не не подойдет так как у каждого ака разный временной интервал работы, один работает раз час другой раз в 6 часов:(
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
Работа со списком чтобы брать первый. Не не подойдет так как у каждого ака разный временной интервал работы, один работает раз час другой раз в 6 часов:(
ну таблица с сортировкой тоже неплохой вариант. только в локе ее надо обрабатывать. удаляешь строку из таблицы и тут же пишешь ее в конец с датой следующего запуска. и все. другие потоки уже не смогут ее взять, у этой записи другая дата стоит. даже никуда не надо дополнительно писать. и профиль не надо копировать. всего лишь 2 операции с таблицей :-)
 

yriy158

Client
Регистрация
10.08.2013
Сообщения
490
Благодарностей
302
Баллы
63
Тоже заметил такую проблему на билде 7.1.5.0. Тоже при перемещении профилей в многопотоке ошибки лезут. Но как-то лень было репортить) Прям сейчас наблюдаю эти ошибки...


ап: самое интересное что для теста только что создал шаблон для теста, один генерирует профили, второй - перемещает...и все работает без ошибок, сука)
ап2? хотя нет, в 20 потоков -все ок, а в 50 начали ошибки лезть. Прикладываю шаблон. Шаб1 - генерирует профили в папку 1, шаблон 2 - перемещает с папки 1 в папку 2
 

Вложения

Последнее редактирование:

fortaran

Client
Регистрация
22.04.2020
Сообщения
32
Благодарностей
1
Баллы
8
ну таблица с сортировкой тоже неплохой вариант. только в локе ее надо обрабатывать. удаляешь строку из таблицы и тут же пишешь ее в конец с датой следующего запуска. и все. другие потоки уже не смогут ее взять, у этой записи другая дата стоит. даже никуда не надо дополнительно писать. и профиль не надо копировать. всего лишь 2 операции с таблицей :-)
я думал над тем чтобы без перемещения профилей делать. но чтобы не взяли 2 раза это и затеял! как запасной вариант
 

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