Многопоточность при работе с Google Docs

AlexVerkhov

Client
Регистрация
29.03.2016
Сообщения
24
Благодарностей
0
Баллы
1
Здравствуйте, коллеги. Прошу помощи в таком вопросе. Есть Google Spreadshit таблица. Есть 10 потоков, каждый из которых должен брать одну строку из таблицы, работать с ней, дальше брать следующую и так далее. Одна строка должна быть в работе только 2 раза. То есть 2 потока должны взять ее, остальные пойти дальше.

Какой механизм является наиболее оптимальным для такой задачи? Так как, как я понимаю, если я дам 10 потоков на такой файл, они с большой вероятностью начнут брать одну строку множество раз, перезаписывать результат работы друг друга и будут дублировать друг друга. Также боты должны создавать новые строки в ней, не перезаписывая действия других потоков (это решается атомарным добавлением, тут нет вопросов)

То есть, как сообщить другим потокам, что текущая строка уже в работе у двух ботов?
Обновляется таблица долго. Если боты, которые взяли строку первыми, запишут в нее флаг о том, что каждый из них забрал в работу строку, то пока эти флаги они дойдут до таблицы и назад в другие потоки, другие боты уже 10 раз возьмут в работу эту же строку. Чего необходимо избежать. Как это решить?

Буду признателен за совет.
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
зачем нужна гугл таблица в этой задаче ? не проще использовать локальные файлы для работы ботов ?
если сравнивать работу гугл таблицы и обычной таблицы именно в зенно, то разницы никакой нет. Все боты работают с кешем зенки и они видят изменения в таблице намного быстрее чем обновится сама таблица, которая может и не обновится запросто. это с учетом того что боты работают в одной программе. если цель синхронизировать работу ботов на разных машинах, то гугл таблица это самый плохой вариант.
Что бы сделать то что описано , надо завести счетчик в строке и когда поток берет строку в работу то увеличивать счетчик и сравнивать с максимальной уставкой. все эти действия надо делать в локе.
 

AlexVerkhov

Client
Регистрация
29.03.2016
Сообщения
24
Благодарностей
0
Баллы
1
Спасибо
 

AlexVerkhov

Client
Регистрация
29.03.2016
Сообщения
24
Благодарностей
0
Баллы
1
зачем нужна гугл таблица в этой задаче ? не проще использовать локальные файлы для работы ботов ?
если сравнивать работу гугл таблицы и обычной таблицы именно в зенно, то разницы никакой нет. Все боты работают с кешем зенки и они видят изменения в таблице намного быстрее чем обновится сама таблица, которая может и не обновится запросто. это с учетом того что боты работают в одной программе. если цель синхронизировать работу ботов на разных машинах, то гугл таблица это самый плохой вариант.
Что бы сделать то что описано , надо завести счетчик в строке и когда поток берет строку в работу то увеличивать счетчик и сравнивать с максимальной уставкой. все эти действия надо делать в локе.
Спасибо за конструктив. Решение выбрать Google Docs аргументируется тем, что необходимо дать возможно разным людям вносить в файл изменения (в это время боты неактивны конечно). Без необходимости пускать народ на VDS. В этом ключе докс выигрывает. Плюс история изменений в докс, которая нам нужна для этой задачи.

Все боты - это один инстанс ZennoPoster, то есть да, в одной программе.
Я уже думал, ставить в ячейку, допустим вертикальную палку. Если бот взял строку в работу, добавляем "|", еще один взял в работу - поставил еще одну, получилось "||". Завершил работу - убрал палку.

Ключевой вопрос в том - в моменте ли остальные потоки увидят эту поставленную палку или только через минуту, когда дойдет дело до обновления? Если в моменте, тогда, как я понимаю, решение с палками, описанное выше, будет рабочим. Так?
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
На мой взгляд самый лучший вариант - это брать строку с удалением. Взяли, провели манипуляции, вернули строку в конец таблицы. При таком подходе каждый поток будет брать уникальную строку.
 

AlexVerkhov

Client
Регистрация
29.03.2016
Сообщения
24
Благодарностей
0
Баллы
1
На мой взгляд самый лучший вариант - это брать строку с удалением. Взяли, провели манипуляции, вернули строку в конец таблицы. При таком подходе каждый поток будет брать уникальную строку.
Со строкой должны работать несколько ботов, допустим 2. Удаление и возвращение - то же самое, если в какой-то ячейке каждый бот, который берет в работу строку, будет добавлять "|" и удалять "|" при завершении работы с ней. Главное - сразу ли увидят другие потоки, что в этой строке "||" появились и третий бот проигнорирует ее, пойдет дальше. Или другие обновятся только через минуту.
 

AlexVerkhov

Client
Регистрация
29.03.2016
Сообщения
24
Благодарностей
0
Баллы
1
Я услышал про кеш, с которым работают боты. То есть все 10 потоков работают с одним кешем при подключении к конкретной таблице? И если один пишет в нее что-то, другие в реальном времени получают обновление у себя в локальных копиях этой Google Docs таблицы? и не нуждаются в выгрузке из сети для того, чтобы эти "||" до них дошли?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
Я услышал про кеш, с которым работают боты. То есть все 10 потоков работают с одним кешем при подключении к конкретной таблице? И если один пишет в нее что-то, другие в реальном времени получают обновление у себя в локальных копиях этой Google Docs таблицы? и не нуждаются в выгрузке из сети для того, чтобы эти "||" до них дошли?
выгрузка таблицы, не влияет на то что видят боты в зенке. если их лочить на этой операции, то все будет нормально. если не лочить , то будет бардак.
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
Я услышал про кеш, с которым работают боты. То есть все 10 потоков работают с одним кешем при подключении к конкретной таблице?
Если речь о потоках, которые работают на одном компьютере (одна программа ZennoPoster), тогда "Да", все эти потоки работают с одной виртуальной копией таблицы, изменения все потоки видят сразу же (не обязательно ждать их выгрузки в облако).

Со строкой должны работать несколько ботов, допустим 2. Удаление и возвращение - то же самое, если в какой-то ячейке каждый бот, который берет в работу строку, будет добавлять "|" и удалять "|" при завершении работы с ней. Главное - сразу ли увидят другие потоки, что в этой строке "||" появились и третий бот проигнорирует ее, пойдет дальше. Или другие обновятся только через минуту.
Если использовать стандартные экшены, при таком сценарии, то, боюсь, в какой-то момент начнётся путаница. Чтобы этого избежать, придётся использовать C# и конструкцию lock: объявляем lock, ищем подходящую строку, берём её, обновляем данные, выходим из лока.
 

AlexVerkhov

Client
Регистрация
29.03.2016
Сообщения
24
Благодарностей
0
Баллы
1
выгрузка таблицы, не влияет на то что видят боты в зенке. если их лочить на этой операции, то все будет нормально. если не лочить , то будет бардак.
Объясните пожалуйста, что значит лочить в вашем выражении? (ап: уже понял, что вы имели ввиду)
 

AlexVerkhov

Client
Регистрация
29.03.2016
Сообщения
24
Благодарностей
0
Баллы
1
Если речь о потоках, которые работают на одном компьютере (одна программа ZennoPoster), тогда "Да", все эти потоки работают с одной виртуальной копией таблицы, изменения все потоки видят сразу же (не обязательно ждать их выгрузки в облако).


Если использовать стандартные экшены, при таком сценарии, то, боюсь, в какой-то момент начнётся путаница. Чтобы этого избежать, придётся использовать C# и конструкцию lock: объявляем lock, ищем подходящую строку, берём её, обновляем данные, выходим из лока.
Так, понял. Я смогу залокировать таблицу, найти нужную строку обычным экшном и далее разблокировать ее в C#? Это рабочее решение? Или чтобы работать с локом, придется целиком на шарпе писать логику?
 

AlexVerkhov

Client
Регистрация
29.03.2016
Сообщения
24
Благодарностей
0
Баллы
1

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
Так, понял. Я смогу залокировать таблицу, найти нужную строку обычным экшном и далее разблокировать ее в C#? Это рабочее решение? Или чтобы работать с локом, придется целиком на шарпе писать логику?
Да, чтобы работать с локом придётся всю логику делать на C#.
 

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