Быстрое решение для тупика?

Вот что мы придумали для копирования одного поля в другое для ~ 150_000 записей. Это заняло около 6 минут, но все еще значительно менее ресурсоемким, чем это было бы для создания экземпляра и повторения одного и того же количества объектов ruby.

js_query = %({
  $or : [
    {
      'settings.mobile_notifications' : { $exists : false },
      'settings.mobile_admin_notifications' : { $exists : false }
    }
  ]
})

js_for_each = %(function(user) {
  if (!user.settings.hasOwnProperty('mobile_notifications')) {
    user.settings.mobile_notifications = user.settings.email_notifications;
  }
  if (!user.settings.hasOwnProperty('mobile_admin_notifications')) {
    user.settings.mobile_admin_notifications = user.settings.email_admin_notifications;
  }
  db.users.save(user);
})

js = "db.users.find(#{js_query}).forEach(#{js_for_each});"
Mongoid::Sessions.default.command('$eval' => js)
2
задан amjad 15 January 2019 в 10:11
поделиться

2 ответа

мы можем просто добавить несколько тривиальных операторов, таких как single; или int test = 0 между операциями P и V, что создаст вертикальный разрыв между двумя запрещенными областями, так что потоки могут в конечном итоге пройти через этот разрыв, как показано на рисунке ниже

first ";" (что вы ожидаете получить для того, что сгенерировано компилятором?) или int test = 0; не создаст пробел, и даже когда выполнение или потоки асинхронны, вы не можете предполагать что-то об их выполнении, и именно поэтому у вас есть мьютексы btw

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

0
ответ дан bruno 15 January 2019 в 10:11
поделиться

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

Да, реструктуризация кода, чтобы ни один поток не блокировал более одного мьютекса за раз, является гарантированным способом предотвращения взаимоблокировки потоков при захвате мьютекса, но это также может усложнить для вашей программы эффективно делайте все, что вам нужно. Таким образом, существует анти-паттерн Giant Lock .


Re, «Быстрое решение проблемы тупика?»

«Тупик» - это архитектурная проблема. Нет быстрых решений для архитектурных проблем.

0
ответ дан Solomon Slow 15 January 2019 в 10:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: