<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.parallel.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'philosophy.parallel.php',
    1 => 'Философия',
    2 => 'Философия',
  ),
  'up' => 
  array (
    0 => 'book.parallel.php',
    1 => 'parallel',
  ),
  'prev' => 
  array (
    0 => 'parallel.setup.php',
    1 => 'Установка',
  ),
  'next' => 
  array (
    0 => 'functional.parallel.php',
    1 => 'Функциональный API',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/parallel/philosophy.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="philosophy.parallel" class="chapter">
 <h1 class="title">Философия</h1>

 <p class="simpara">
  Раздел содержит основные принципы, важные для написания параллельного кода и некоторые подробности о внутренней реализации parallel.
 </p>
 <div class="simplesect">
   <h3 class="title">Не общайтесь, разделяя память; вместо этого поделитесь памятью, с помощью общения.</h3>
   <p class="simpara">
    Эта философия, которой придерживается parallel, берёт своё начало из Go, одной из самых популярных из используемых платформ для написания параллельного кода в настоящее время.
    Программисты на Go должны упорно трудиться, чтобы соответствовать этому идеалу: PHP и параллельный интерфейс делают всю тяжёлую работу за программиста,
    причём по умолчанию.
   </p>
   <p class="simpara">
    В традиционных моделях потоковой передачи, встречающихся в других языках, потоки обычно обмениваются данными друг с другом только благодаря тому факту, что они работают в одном и том же адресном пространстве.
    Программист должен использовать взаимное исключение, переменные условия и другие низкоуровневые примитивы потоковой передачи или синхронизации, чтобы обеспечить надлежащую передачу состояния и согласованность.
   </p>
   <p class="simpara">
    Когда обычная модель инвертирована, это означает, что потоки совместно используют память только в результате обмена данными (например, переменная передаётся по каналу).
   </p>
   <p class="simpara">
    Когда parallel передаёт переменную из одного потока в другой любым способом - аргументами задачи, возвратом через Future и каналами - она передаётся по значению.
    Во всех случаях, кроме небуферизованных каналов, переменная также буферизуется, поэтому она не может измениться (или быть уничтожена) до того, как она будет использована в любом потоке,
    в который передаётся переменная. Небуферизованное чтение по каналу - единственный случай, когда поток непосредственно читает память,
    выделенную другим потоком, это можно сделать безопасно, потому что поток, владеющий памятью, ожидает завершения чтения, прежде чем он сможет продолжить управлять им, и поток, которому не принадлежит память, читает по значению.
    Когда оба потока продолжают работу, они больше не разделяют память.
   </p>
   <p class="simpara">
    Это значительно упрощает написание параллельного кода и рассуждения о нём по сравнению с традиционной моделью многопоточности.
    Это означает, что программисту не нужно учитывать, что потоки могут одновременно управлять данными, потому что это невозможно.
   </p>
   <p class="simpara">
    Это также делает PHP идеальной платформой для реализации API параллельного кода на основе CSP (передача сообщений по каналам),
    поскольку сам PHP ничего не разделяет - потоки PHP по умолчанию работают в собственном виртуальном адресном пространстве и поэтому могут совместно использовать память только путём обмена данными.
   </p>
 </div>
 <div class="simplesect">
  <h3 class="title">У данных должен быть окончательный единственный владелец</h3>
  <p class="simpara">
   Приближаясь к модели CSP в первый раз, программист, разбирающийся в традиционной модели потоковой передачи,
   может обнаружить, что ищет параллельные структуры данных, потому что это то,
   что они тоже используют: они передают общие объекты для управления.
  </p>
  <p class="simpara">
   Когда дело доходит до модели CSP, нет необходимости в том, чтобы структуры данных совместно использовались многими задачами и действительно,
   это проще, если это не так. Данные должны принадлежать одной задаче, изменения (или операции) в этой структуре данных должны передаваться по каналам
   и выполняться владельцем данных, успешное выполнение, ошибка или результат (состояние) изменения (или операции) передаётся обратно.
  </p>
  <p class="simpara">
   Опять же, природа PHP ничего не разделяет и природа параллельного копирования по значению помогают программисту достичь этой цели, никакие данные не будут переданы случайно, только в результате обмена данными.
  </p>
 </div>
</div>
<?php manual_footer($setup); ?>