Возможно ли добавить lock ресурса?



  • Часто возникает задача, нужно не просто взять ресурс, но, например сделать так, чтобы сначала один поток взял первые 5 ресурсов, затем следующий 5 и т.д. При этом пока первый берет ресурсы, остальные потоки ждут. Можно добавить что-то на подобии "Игнорировать ошибки", только "Lock ресурса". И пока выполняются действия в этом блоке, ресурс залочен. Возможно ли такое добавить? И можно ли уже в данной версии выполнить такую задачу?



  • @lev
    Если брать только по 1 ресурса, то так и происходит. Остальные потоки не могут его использовать.
    Если брать 5 ресурсов подряд, то залочится только последний.
    Чтобы залочить все до конца работы потока используйте действие "Выполнить код" с параметром:

    R("ИМЯ_РЕСУРСА")!
    [[ИМЯ_ПЕРЕМЕННОЙ]] = _result().get()
    
    


  • @support А последний код он как работает? Он лочит пока поток полностью не завершится вообще или пока вот этот пользовательский код выполняется? Если вообще пока поток не завершится, то и в многопотоке смысла нет, так как все фактически потоки последовательно будут работать..



  • @support Я просто как делаю. Один поток берет 5 ресурсов и мгновенно удаляет их из файла, потом следующий поток - 5 ресурсов и удаляет их из файла. А лок нужен, чтобы все было последовательно. Первый - 5 штук взял - удалил, второй 5 штук - удалил. Ну и если б можно было лочить ресурс при выполнении части кода, то было б много возможностей.



  • @support Или хотя бы добавить экшн - выделить подсписок ресурса, или как правильно выразиться. Вот есть экшн ресурс в список. Но по сути, получается, что он полезен только для однопоточных приложений ...



  • @lev

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



  • @support Ок, можно еще тогда один небольшой вопрос. Я запускаю 5 потоков. Каждый поток у меня берет строку. Перед тем как взять строку я проверяю, есть ли еще строки в списке. Так вот, предположим 4 поток определил, что в ресурсе строки закончились. Как мне прервать выполнение скрипта, но так, чтобы предыдущие три потока доделали все до конца. Экшн Прервать Скрипт, завершают сразу все потоки (даже те, которые уже запущены, но еще на пол пути до завершения). И получается если 4 поток определил, что пора заканчивать, он прерывает все остальные потоки ... Надеюсь понятно объяснил....
    Если не прерывать скрипт, а просто брать ресурс, который уже пустой, то поток прерывается, но прерывает и все остальные, которые могли успешно завершить работу



  • @lev Так и происходит по умолчанию. Если какой-то поток использует ресурс - скрипт не завершиться, пока поток не отпустит этот ресурс.

    Если не прерывать скрипт, а просто брать ресурс, который уже пустой, то поток прерывается, но прерывает и все остальные, которые могли успешно завершить работу

    Так будет только если удалять преждевременно, попробуйте не удалять ресурс и будет работать так, как вы хотите.
    Если хотите удалить строки из файла, после того, как ресурсы были использованы - используйте чекбокс "Запись" при создании ресурса.

    Вот проект, который решает вашу задачу:

    lock2.xml



  • @support ок, спасибо, я кажется понял. Т.е. если у меня 3 ресурса есть, то с 2 я могу работать в ручном режиме (т.е. удалять из базы мгновенно), но с одним, для нормальной работы в многопотоке - в автоматическом режиме надо работать (notreuse и возможность записи в файл), вроде так



  • @support Еще, было б круто, если б у экшена "Прервать сркипт" была такая опцию, что б он работал также, как и при попытке взять ресурс из пустого списка. Сейчас же "Прервать скрипт" - все прерывает, даже если ресурсы залочены и в работе. Ну понятно, что эта функция не мега важная, но в будущем может)



  • @lev а нет, я неправильно подумал, все ресурсы нужно использовать в автоматическом режиме, иначе, если использовать ресурс в ручном режиме и он закончится, то он прервет скрипт, и не обратит внимания ни на что. Блин, это плохо тем, что если я беру по 5 строк из ресурса, а у меня в нем 43 строки, то 40 строк возьмется, а последние три строки не возьмутся, т.к. поток попытается 5 штку взять, у него не получится и он прервется ....



  • @support можно было б проверять по количеству строк в ресурсе (если остается строк в ресурсе меньше 5, то брать все строки), но в автоматическом режиме одна строка лочится и удаляется после завершения потока, и так не проверишь



  • @lev

    Т.е. если у меня 3 ресурса есть, то с 2 я могу работать в ручном режиме (т.е. удалять из базы мгновенно), но с одним, для нормальной работы в многопотоке - в автоматическом режиме надо работать (notreuse и возможность записи в файл), вроде так

    Да, но удалять вручную не обязательно, лучше пусть БАС сделает это автоматом.

    Еще, было б круто, если б у экшена "Прервать сркипт" была такая опцию, что б он работал также, как и при попытке взять ресурс из пустого списка.

    Он так и работает. Еще есть действие Fail, которое прерывает поток, но не прерывает скрипт.

    Сейчас же "Прервать скрипт" - все прерывает, даже если ресурсы залочены и в работе. Ну понятно, что эта функция не мега важная, но в будущем может)

    Ок, но зачем юзать это действие, если БАС сам прерывает работу приложения когда все ресурсы отработали.

    Блин, это плохо тем, что если я беру по 5 строк из ресурса, а у меня в нем 43 строки, то 40 строк возьмется, а последние три строки не возьмутся, т.к. поток попытается 5 штку взять, у него не получится и он прервется ....

    Попробуйте установить флаг "Не прерывать приложение" и обернуть в действие "Игнорировать ошибки" если хотите, чтобы приложение не прерывалось, если ресурс закончился.

    0_1473330496566_DontBreakApp.png



  • @support said in Возможно ли добавить lock ресурса?:

    Да, но удалять вручную не обязательно, лучше пусть БАС сделает это автоматом.

    Я тестировал. И получается такая ситуация. Есть 2 ресурса. С одним я решил работать в автоматическом режиме, с другим - в ручном. Если в первом заканчиваются ресурсы, то он ждет, когда остальные потоки доработают, если в ручном заканчиваются ресурсы, то он сразу все прерывает и не обращает внимание, что у других потоков есть ресурсы в локе. Видимо он смотрит только за своими ресурсами. В первом случае он видит, ага, у меня есть в списке ресурсы залоченные, подожду .... Во втором случае он смотрит на свои ресурсы и видит, что список пустой, в нем нет залоченных ресурсов, а то что в соседнем ресурсе есть залоченные строки, он не обращает внимания. У меня был проект, но могу еще раз сделать, если не верите

    Он так и работает. Еще есть действие Fail, которое прерывает поток, но не прерывает скрипт.

    "Прервать скрипт" не обращает внимание на то, залочены какие-либо ресурсы у потока или нет, ща проект накидаю...

    Попробуйте установить флаг "Не прерывать приложение" и обернуть в действие "Игнорировать ошибки" если хотите, чтобы приложение не прерывалось, если ресурс закончился.

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


    Вы можете помочь решить такой пример.
    Есть ресурс, в нем 12 строк (пусть цифры от 1 до 12)
    Скрипт запускается в 5 потоков
    Количество успехов - 100000
    Количество неудач - 100000

    Необходимо, чтобы поток брал по 5 строк с удалением из файла ресурса.
    Далее писал в лог - взяты строки [перечислены эти пять строк]
    Переходил на яндекс ру
    И писал в лог "Загрузили яндекс"

    И чтобы он успешно взял последние 3 строчки
    Это бы все очень прояснило. Заранее спасибо, а то я уже никак не могу ничего понять.



  • @lev

    Вы можете помочь решить такой пример.

    Да, пожалуйста.

    lock3.xml



  • @lev Не стал отвечать на вопросы, по скрипту должно быть понятно. Хотя согласен, что это не очень удобно. Возможно добавлю действие, которое будет брать пачку строк.



  • @support Спасибо за пример. Да, было б круто, если б появился такой экшн. А то очень много писанины для такой простой операции. Проще бы было, если б был экшн "Прервать скрипт", но который не прерывал бы уже запущенные потоки. Тогда можно было б в ручную проверять количество строк в ресурсе через "ресурс в список", и мгновенно удалять строку ресурса, если ресурс не пустой. Больше было б возможности. Еще раз спасибо, а то я со вчерашнего вечера сижу-думаю)))



  • @lev Тогда лучше сделать параметр для всего скрипта, который ждет окончания каждого потока. Потому что "Прервать скрипт" юзают мало



  • @support Всмысле? Ну это то, о чем я и говорил, типа не прервать скрипт, а прервать скрипт, и ждать, когда запущенные потоки закончат работу?. Если да, то вы сделаете к следующему обновлению?) А то я тогда подожду лучше)



  • @lev

    Всмысле? Ну это то, о чем я и говорил, типа не прервать скрипт, а прервать скрипт, и ждать, когда запущенные потоки закончат работу?

    Да.

    Если да, то вы сделаете к следующему обновлению?) А то я тогда подожду лучше)

    Скорее всего не успею


Log in to reply