mirror of
https://github.com/php/doc-ru.git
synced 2026-03-23 23:32:16 +01:00
190 lines
11 KiB
XML
190 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: bf92d8bd839301de7c837d20ab1dac6c14f83bbf Maintainer: rjhdby Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<book xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="book.pthreads">
|
||
<?phpdoc extension-membership="pecl" ?>
|
||
<title>pthreads</title>
|
||
<titleabbrev>pthreads</titleabbrev>
|
||
|
||
<preface xml:id="intro.pthreads">
|
||
&reftitle.intro;
|
||
<simpara>
|
||
pthreads предоставляет объектно-ориентированный API для работы с многопоточностью в PHP.
|
||
Приложения на PHP могут создавать, читать, записывать, запускать и выполнять синхронизацию с объектами Threads, Workers и Threaded.
|
||
</simpara>
|
||
<warning>
|
||
<simpara>
|
||
Модуль считается неподдерживаемым и мёртвым.
|
||
</simpara>
|
||
</warning>
|
||
<tip>
|
||
<simpara>
|
||
Попробуйте вместо этого использовать <link linkend="book.parallel">parallel</link>.
|
||
</simpara>
|
||
</tip>
|
||
<warning>
|
||
<simpara>
|
||
Модуль доступен только для CLI-приложений.
|
||
Исходя из этого, многопоточность в PHP в окружении веб-сервера недоступна.
|
||
</simpara>
|
||
</warning>
|
||
<warning>
|
||
<simpara>
|
||
pthreads (v3) может использоваться только с PHP 7.2 и выше, так как ZTS-режим нестабилен в 7.0 и 7.1.
|
||
</simpara>
|
||
</warning>
|
||
<simpara>
|
||
Класс <classname>Threaded</classname> предоставляет базовый
|
||
функционал, необходимый для работы pthreads. Он предоставляет
|
||
методы синхронизации и некоторые полезные для разработчика
|
||
интерфейсы.
|
||
</simpara>
|
||
<simpara>
|
||
Класс <classname>Thread</classname> позволяет создавать потоки.
|
||
Для создания потока необходимо создать наследующие его класс и
|
||
в нём реализовать метод <literal>run</literal>.
|
||
Любые свойства могут быть записаны и прочитаны из любого контекста
|
||
через ссылку на поток. Также из любого контекста
|
||
могут быть вызваны публичные и защищённые методы. Метод run будет
|
||
запущен в отдельном потоке, как только будет вызван
|
||
метод <methodname>Thread::start</methodname> из контекста, в котором он
|
||
был создан. Стартовать и присоединить поток можно только в том контексте,
|
||
где он был создан.
|
||
</simpara>
|
||
<simpara>
|
||
Класс <classname>Worker</classname> имеет постоянное состояние и
|
||
будет доступен из метода <methodname>Thread::start</methodname>
|
||
(унаследованный метод) до тех пор, пока объект не выйдет из
|
||
области видимости, либо пока не будет принудительно остановлен
|
||
(с помощью <methodname>Worker::shutdown</methodname>).
|
||
Любой контекст имеющий ссылку к данному объекту может добавлять
|
||
задания на стек Worker (с помощью
|
||
<methodname>Worker::stack</methodname>), которые будут запущены
|
||
в отдельном потоке. Метод <literal>run</literal> объекта Worker
|
||
будет запущен раньше, чем любой объект с его стека задач, что
|
||
даёт возможность инициализировать необходимые для задачи
|
||
ресурсы.
|
||
</simpara>
|
||
<simpara>
|
||
Класс <classname>Pool</classname> используется для создания группы
|
||
исполнителей (worker) для распределения между ними объектов
|
||
<classname>Threaded</classname>. Это самый простой и эффективный
|
||
вариант использования многопоточности в PHP.
|
||
</simpara>
|
||
<caution>
|
||
<simpara>
|
||
Класс <classname>Pool</classname> не наследует
|
||
<classname>Threaded</classname>, таким образом являясь обычным
|
||
объектом PHP. Объекты этого класса не должны разделяться по различным
|
||
контекстам.
|
||
</simpara>
|
||
</caution>
|
||
<simpara>
|
||
Класс <classname>Volatile</classname> добавлен в pthreads v3. Он
|
||
используется для задания изменяемых
|
||
<classname>Threaded</classname>-свойств классов типа
|
||
<classname>Threaded</classname> (так как теперь они по умолчанию
|
||
неизменяемы). Также используется для хранения массивов PHP
|
||
в контексте <classname>Threaded</classname>.
|
||
</simpara>
|
||
<simpara>
|
||
Синхронизация - важная часть многопоточности. Все объекты,
|
||
созданные pthreads, имеют встроенные методы для обеспечения
|
||
синхронизации (они покажутся очень знакомыми для разработчиков
|
||
на Java): <methodname>Threaded::wait</methodname> и
|
||
<methodname>Threaded::notify</methodname>. Вызов
|
||
<methodname>Threaded::wait</methodname> переведёт объект в
|
||
ожидание до того момента, пока из другого контекста не будет вызван
|
||
<methodname>Threaded::notify</methodname> для ожидающего объекта.
|
||
Этот механизм позволяет осуществлять синхронизацию между
|
||
объектами <classname>Threaded</classname>.
|
||
</simpara>
|
||
<caution>
|
||
<simpara>
|
||
Любые объекты вашего приложения, которые предполагается использовать
|
||
в многопоточном режиме, должны наследовать
|
||
<classname>Threaded</classname>.
|
||
</simpara>
|
||
</caution>
|
||
<simpara>
|
||
Хранение данных:
|
||
Как правило, в объекте Threaded можно использовать любые данные,
|
||
которые могут быть сериализованы. Они могут быть записаны и прочтены из
|
||
любого контекста через ссылку на этот объект.
|
||
Не каждый тип данных хранится в сериализованном виде. Базовые типы
|
||
хранятся в их истинной форме. Сложные типы, массивы и объекты , не
|
||
являющиеся Threaded, хранятся сериализованными; они могут быть
|
||
прочитаны или записаны в Threaded-объект из любого контекста по
|
||
ссылке.
|
||
За исключением Threaded-объектов, все ссылки, использующиеся
|
||
для установки свойства в Threaded-объекте отделены от ссылок внутри
|
||
Threaded-объекте. Чтение тех же данных можно производить напрямую
|
||
из любого контекста по ссылке на Threaded-объекте.
|
||
</simpara>
|
||
<simpara>
|
||
Статические свойства:
|
||
Когда создаётся новый контекст (Thread или Worker), они просто копируются,
|
||
но ресурсы и объекты обнуляются (из соображения безопасности). Это
|
||
позволяет использовать их как локальные для потока хранилища. К примеру,
|
||
во время создания контекста, для класса, статические свойства которого хранят
|
||
информацию о соединении к БД и само соединение, будет скопирована только
|
||
информация необходимая для соединения, но не само соединение. Это
|
||
позволит создать новое соединение в новом контексте и сохранить его
|
||
в том же месте никак не затрагивая оригинальный контекст.
|
||
</simpara>
|
||
<caution>
|
||
<simpara>
|
||
Когда запускаются print_r, var_dump или другие отладочные функции,
|
||
они не включают защиту от рекурсии.
|
||
</simpara>
|
||
</caution>
|
||
<note>
|
||
<simpara>
|
||
Ресурсы:
|
||
Модули и функциональность PHP, создающие ресурсы, совершенно не
|
||
подготовлены для такого типа окружения; pthreads предоставляет
|
||
механизм разделения ресурсов между контекстами, однако
|
||
для большинства типов ресурсов его следует считать небезопасным.
|
||
Разделяя ресурс между контекстами необходимо быть крайне внимательным
|
||
и осторожным.
|
||
</simpara>
|
||
</note>
|
||
<caution>
|
||
<simpara>
|
||
В окружении, где запускается pthreads, необходимы некоторые ограничения
|
||
и запреты для обеспечения стабильности.
|
||
</simpara>
|
||
</caution>
|
||
</preface>
|
||
|
||
&reference.pthreads.setup;
|
||
&reference.pthreads.constants;
|
||
&reference.pthreads.threaded;
|
||
&reference.pthreads.thread;
|
||
&reference.pthreads.worker;
|
||
&reference.pthreads.collectable;
|
||
&reference.pthreads.pool;
|
||
&reference.pthreads.volatile;
|
||
|
||
</book>
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|