Из руководства по PHP для pthreads расширение:
pthreads - это объектно-ориентированный API, который позволяет многопоточность для пользователя в PHP. Он включает в себя все инструменты, необходимые для создания многопоточных приложений, предназначенных для Интернета или консоли. Приложения PHP могут создавать, читать, писать, выполнять и синхронизировать с потоками, рабочими и стекируемыми объектами.
Как бы невероятно это не звучало, это совершенно верно. Сегодня PHP может быть многопоточным для тех, кто хочет попробовать его.
Первый выпуск PHP4, 22 мая 2000 г., PHP был поставлен с поточно-ориентированной архитектурой - способом для выполнения нескольких экземпляров своего интерпретатора в отдельных потоках в многопоточных средах SAPI (Server API). За последние 13 лет дизайн этой архитектуры поддерживался и совершенствовался: с тех пор он широко используется на крупнейших веб-сайтах мира.
Многопоточность в пользовательской среде никогда не была проблемой для команды PHP, и сегодня она остается таковой. Вы должны понимать, что в мире, где PHP занимается бизнесом, уже существует определенный метод масштабирования - добавьте оборудование. За многие годы существования PHP, аппаратные средства становились все дешевле и дешевле, и это все меньше и меньше беспокоило команду PHP. В то время как это становилось дешевле, это также становилось намного более сильным; сегодня наши мобильные телефоны и планшеты имеют двухъядерную и четырехъядерную архитектуры и достаточно оперативной памяти, наши настольные компьютеры и серверы обычно имеют 8 или 16 ядер, 16 и 32 гигабайта оперативной памяти, хотя у нас не всегда может быть два в рамках бюджета и наличие двух рабочих столов редко бывает полезным для большинства из нас.
Кроме того, PHP был написан для непрограммиста, это родной язык многих любителей. Причина, по которой PHP так легко внедряется, заключается в том, что это простой язык для изучения и написания. Причина, по которой сегодня PHP так надежен, заключается в огромном объеме работ, которые вносятся в его дизайн, и в каждое отдельное решение, принимаемое группой PHP. Надежность и абсолютное величие держат его в центре внимания после всех этих лет; где его соперники упали на время или давление.
Многопоточное программирование нелегко для большинства, даже с самым последовательным и надежным API, есть разные вещи, о которых нужно подумать, и множество заблуждений. Группа PHP не желает, чтобы многопоточность пользователей была основной функцией, ей никогда не уделялось серьезного внимания - и это правильно. PHP не должен быть сложным для всех.
Учитывая все вышесказанное, все еще есть преимущества, которые дает PHP, позволяющий использовать его готовые к работе и протестированные функции, позволяющие максимально эффективно использовать то, что у нас есть, когда добавление большего количества не всегда является вариантом, и для многих задач это действительно не нужно.
pthreads предоставляет API для тех, кто позволяет многопоточным PHP-приложениям. Его API в значительной степени находится в стадии разработки и обозначен как бета-уровень стабильности и полноты.
Общеизвестно, что некоторые библиотеки, которые использует PHP, не являются потокобезопасными, программисту должно быть ясно, что pthreads не может это изменить и не пытается пытаться. Однако любая библиотека, которая является поточно-ориентированной, пригодна для использования, как и в любой другой поточно-безопасной настройке интерпретатора.
pthreads использует потоки Posix (даже в Windows), то, что создает программист, является реальными потоками выполнения, но для того, чтобы эти потоки были полезны, они должны знать PHP - способны выполнять пользовательский код, обмениваться переменными и предоставлять полезные средства связи (синхронизация). Таким образом, каждый поток создается с экземпляром интерпретатора, но по своей конструкции его интерпретатор изолирован от всех других экземпляров интерпретатора - так же, как и многопоточные среды API сервера. Pthreads пытается преодолеть разрыв в разумной и безопасной форме. Многие из проблем программиста потоков в C просто не связаны с программистом pthreads. По своей конструкции pthreads - это копирование при чтении и копирование при записи (оперативная память дешева), поэтому никакие два экземпляра никогда не манипулируют одними и теми же физическими данными , но они оба могут влиять на данные в другом потоке. Тот факт, что PHP может использовать функции небезопасных потоков в своем основном программировании, совершенно не имеет значения, пользовательские потоки и его операции полностью безопасны.
Зачем копировать при чтении и копировать при записи:
public function run() {
...
(1) $this->data = $data;
...
(2) $this->other = someOperation($this->data);
...
}
(3) echo preg_match($pattern, $replace, $thread->data);
(1) Пока блокировка чтения и записи удерживается в хранилище данных объекта pthreads, данные копируются из своего исходного местоположения в памяти в хранилище объектов. pthreads не корректирует refcount переменной, Zend может освободить исходные данные, если на них больше нет ссылок.
(2) Аргумент к someOperation ссылается на хранилище объектов, сохраненные исходные данные, которые сами являются копией результата (1), снова копируются для движка в контейнер zval, в то время как происходит блокировка чтения удерживается в хранилище объектов, блокировка снимается, и двигатель может выполнять функцию. Когда zval создан, он имеет refcount 0, что позволяет ядру освободить копию после завершения операции, потому что никаких других ссылок на него не существует.
(3) Последний аргумент preg_match ссылается на хранилище данных, получается блокировка чтения, набор данных в (1) копируется в zval, снова с повторным счетом 0. Блокировка освобождается, вызов preg_match работает с копией данных, которая сама является копией исходных данных.
Что нужно знать:
Хеш-таблица хранилища объектов, в которой хранятся данные, поточно-ориентированные, равна
основанный на TsHashTable, поставляемом с PHP, Zend.
Хранилище объектов имеет блокировку чтения и записи, для TsHashTable предусмотрена дополнительная блокировка доступа, так что если требуется (и он делает, var_dump / print_r, прямой доступ к свойствам, так как механизм PHP хочет ссылаться на них) ) pthreads может манипулировать таблицей TsHashTable вне определенного API.
Блокировки удерживаются только в то время, когда выполняются операции копирования, когда были сделаны копии, блокировки снимаются в разумном порядке.
Это означает:
Когда происходит запись, блокируется не только чтение и запись, но и
дополнительная блокировка доступа. Сам стол заблокирован, нет
Возможный способ, которым другой контекст может блокировать, читать, писать или влиять на него.
Когда происходит чтение, удерживается не только блокировка чтения, но и
дополнительная блокировка доступа, опять же, стол заблокирован.
Никакие два контекста не могут физически или одновременно обращаться к одним и тем же данным из хранилища объектов, но записи, сделанные в любом контексте со ссылкой, повлияют на данные, прочитанные в любом контексте со ссылкой.
Это не разделяемая архитектура, и единственный способ существования - сосуществовать. Те, кто немного подкован, увидят, что здесь происходит много копий, и они зададутся вопросом, хорошо ли это. В динамической среде выполнения происходит довольно много копирования, это динамика динамического языка. pthreads реализуется на уровне объекта, поскольку хороший контроль можно получить над одним объектом, но методы - код, выполняемый программистом - имеют другой контекст, свободный от блокировок и копий, - область действия локального метода. Область действия объекта в случае объекта pthreads должна рассматриваться как способ обмена данными между контекстами, то есть его целью. Имея это в виду, вы можете применять методы, позволяющие избежать блокировки хранилища объектов, если в этом нет необходимости, например, передавать локальные переменные области видимости другим методам в многопоточном объекте, а не копировать их из хранилища объектов при выполнении.
Большинство библиотек и расширений, доступных для PHP, представляют собой тонкие обертки для сторонних разработчиков, функциональность ядра PHP до некоторой степени идентична. pthreads не является тонкой оберткой вокруг Posix Threads; это API потоков, основанный на потоках Posix. Нет смысла в реализации Threads в PHP, который пользователи не понимают или не могут использовать. Нет никаких причин, по которым человек, не имеющий представления о том, что такое мьютекс или нет, не должен иметь возможности использовать все, что у него есть, как с точки зрения навыков, так и ресурсов. Объект функционирует как объект, но там, где иначе два контекста столкнулись бы, pthreads обеспечивает стабильность и безопасность.
Любой, кто работал в java, увидит сходство между объектом pthreads и многопоточностью в java. Те же люди, несомненно, увидят ошибку ConcurrentModificationException - так как она звучит как ошибка, возникающая во время выполнения java, если два потока пишут одни и те же физические данные одновременно. Я понимаю, почему он существует, но меня сбивает с толку то, что с такими дешевыми ресурсами, как они, в сочетании с тем фактом, что среда выполнения способна обнаруживать параллелизм в точное и единственное время, когда безопасность может быть достигнута для пользователя, который он выбирает для генерировать возможно фатальную ошибку во время выполнения, а не управлять выполнением и доступом к данным.
pthreads не выдаст таких глупых ошибок, API написан для того, чтобы сделать поток настолько стабильным и совместимым, насколько это возможно, я полагаю.
Многопоточность не похожа на использование новой базы данных, пристальное внимание следует уделять каждому слову в руководстве и примерам, поставляемым с pthreads.
Наконец, из руководства по PHP:
pthreads был и остается экспериментом с довольно хорошими результатами. Любое из его ограничений или функций может измениться в любое время; это природа экспериментов. Его ограничения - часто налагаемые реализацией - существуют по уважительной причине; Цель pthreads - предоставить полезное решение для многозадачности в PHP на любом уровне. В среде, в которой выполняется pthreads, для обеспечения стабильной среды необходимы некоторые ограничения и ограничения.