Философия
Этот раздел содержит философские принципы, важные для написания параллельного кода, и некоторые подробности о внутренней реализации parallel.
Не общаются, делясь памяти; вместо того, разделяемая память взаимодействие.
Эта философия, которой придерживается parallel, берет свое начало в Go, одной из наиболее широко используемых платформ для написания параллельного кода на данный момент. Программистам Go приходится много работать, чтобы соответствовать этому идеалу: PHP и parallel делают всю тяжелую работу за программиста, причем по умолчанию.
В обычных потоковых моделях, найденных в других языках, обычно потоки взаимодействуют друг с другом только благодаря тому, что они работают в одном адресном пространстве. Программист должен развернуть взаимное исключение, переменные условия и другие низкоуровневые потоки или примитивы синхронизации, чтобы обеспечить надлежащую связь состояния и согласованности.
Когда обычная модель инвертирована, это означает, что потоки только совместно используют память в результате связи (переменная передается по каналу, например).
Когда parallel передает переменную из одного потока в другой любыми способами- аргументами Task, return через Future, и Channel - она передается по значению. Во всех каналах, кроме каналов без буферизации, переменная также буферизуется, так что она не может изменяться (или уничтожаться) до того, как она будет использована в каком потоке передается переменной. Невыделенное чтение по каналу - единственный экземпляр, в котором поток непосредственно считывает память, выделенную другим потоком, он может сделать это безопасно, поскольку поток, владеющий памятью, ожидает завершения чтения, прежде чем он сможет продолжить манипулировать ею, а поток, не владеющий памятью, считывает по значению. Когда оба потока продолжаются, они перестают совместно использовать память.
Это делает написание и рассуждение о параллельном коде намного проще, чем обычная модель потоковой обработки. Это означает, что программисту не нужно учитывать, что потоки могут одновременно манипулировать данными, потому что это невозможно.
Это также делает PHP идеальной платформой для реализации API параллелизма на основе CSP (передача сообщений по каналам), поскольку сам PHP не имеет общего доступа - потоки PHP по умолчанию работают в собственном виртуальном адресном пространстве, и поэтому могут делиться памятью только путем обмена данными.
Данные должны иметь определенного единственного владельца
При первом приближении к модели CSP программист, разбирающийся в традиционной модели многопоточности, может оказаться в поиске параллельных структур данных, потому что это то, что они тоже используются: они проходят вокруг общих объектов для манипулирования.
Когда речь идет о модели CSP, нет необходимости в том, чтобы структуры данных совместно использовались многими задачами, и действительно, проще, если они отсутствуют. (Или операций), что структура данных должна передаваться по каналам и выполняться владельцем данных, успех, сбой или результат (состояние) изменения (или операции), передаваемого обратно.
Опять же ничего общего природа PHP и копировать по стоимости характер параллели помогает программисту достичь этой цели, никакие данные не будут делиться случайно, только когда-либо в результате общения.