1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files

190 lines
11 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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
-->