Как написать безопасный/корректный многопоточный код в.NET?

изображение apache может быть открыто отображено, тогда как образу fpm нужен другой веб-сервер, который затем подключается к fpm

, чтобы представить его в перспективе - следующие docker-compose практически идентичны (для второго требуется vhost будет добавлен, но я думаю, что вы поняли):

php с apache:

services:
   php:
       image: php:7.3-apache-stretch
       ports:
           - 80

php с fpm (для работы требуется apache / nginx):

services:
   php:
       image: php:7.3-fpm-stretch
   apache:
       image: apache
       ports:
           - 80
       links:
           - php

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

.
20
задан Peter Mortensen 28 October 2015 в 21:36
поделиться

4 ответа

Это могло быть крупно , список - считал Joe Duffy, превосходного" Параллельное Программирование В Windows " для намного большего количества детали. Это - в значительной степени "разгрузка мозга"...

  • Стараются не звонить в значительные блоки кода, в то время как Вы владеете блокировкой
  • , Стараются не соединять ссылки, которые кодируют вне класса, мог бы также соединиться
  • , Если когда-нибудь необходимо получать больше чем одну блокировку за один раз, всегда получать, они привязывают тот же порядок
  • , Где разумный, используйте неизменные типы - они могут быть совместно использованы свободно потоками
  • Кроме неизменных типов, стараться избегать потребности обменяться данными между потоками
  • , Стараются не пытаться сделать типы ориентированными на многопотоковое исполнение; большинство типов не должно быть, и обычно код, который должен обменяться данными, должен будет управлять блокировкой себя
  • В приложении WinForms:
    • не работают, любые продолжительные или блокирующиеся операции на потоке UI
    • не касаются UI ни от какого потока кроме потока UI. (Используйте BackgroundWorker, Управление. Invoke/BeginInvoke)
  • Избегают локальных переменных потока (иначе помехи потока), куда возможный - они могут привести к неожиданному поведению, особенно на ASP.NET, где запрос может быть подан различными потоками (поиск "гибкости потока", и ASP.NET)
  • не пытаются быть умным. Свободный от блокировок параллельный код чрезвычайно трудный разобраться.
  • Документируют модель потоков (и потокобезопасность) Ваших типов
  • Монитор. Ожидание должно почти всегда использоваться в сочетании со своего рода проверкой, в некоторое время цикле (т.е. в то время как (я не могу продолжить двигаться), Монитор. Ожидайте (контролируют))
  • , Рассматривают различие между Монитором. Импульс и Монитор. PulseAll тщательно каждый раз Вы используете одного из них.
  • Вставка Потока. Сон, чтобы заставить проблему уйти никогда не является реальной фиксацией.
  • Взглянули на "Параллельные Расширения" и "Время выполнения координации и Параллелизма" как способы сделать параллелизм более простым. Параллельные Расширения будут частью.NET 4.0.

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

25
ответ дан 29 November 2019 в 23:53
поделиться

Я не уверен, как хорошо это поможет для конкретного приложения, Вы работаете с, но здесь являетесь двумя подходами, одолженными от функционального программирования для написания многопоточного кода:

Неизменные объекты

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

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

, Так как объекты неизменны, не возможный для одного потока видоизменять общее состояние под Вашим носом. Это означает, что Вы не должны получать блокировки для написания многопоточного кода. Этот подход устраняет целый класс ошибок, связанных с заведением в тупик, livelocking, и raceconditions.

передача сообщений Erlang-стиля

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

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

Advantanges к этому стилю является устранением блокировок, когда сбои процесса он не снижает Ваше целое приложение. Вот хорошая сводка параллелизма Erlang-стиля: http://www.defmacro.org/ramblings/concurrency.html

11
ответ дан 29 November 2019 в 23:53
поделиться

Используйте FIFOs. Многие из них. Это - древний секрет аппаратного программиста, и это убралось подобру-поздорову несколько раз.

2
ответ дан 29 November 2019 в 23:53
поделиться

Это шаги к записи качества (легче читать и понять) многопоточный код:

  1. Выезд Библиотека Поточной обработки Питания Jeffrey Richter
  2. Смотрит видео - быть пораженной
  3. , Занимают время для получения более подробно понимания того, что действительно продолжается, читайте, статьи 'Параллельного Дела нашли здесь .
  4. Начинают писать устойчивые, безопасные многопоточные приложения!
  5. Понимают, что это все еще не настолько просто, сделайте некоторые ошибки и учитесь от них... повторяют..., что повторение... повторяется :-)
0
ответ дан 29 November 2019 в 23:53
поделиться