# pthreads

# Введение

pthreads предоставляет объектно-ориентированный API для работы с многопоточностью в PHP. Приложения на PHP могут создавать, читать, записывать, запускать и выполнять синхронизацию с объектами Threads, Workers и Threaded.

Внимание

Модуль считается неподдерживаемым и мёртвым.

Подсказка

Попробуйте вместо этого использовать parallel.

Внимание

Модуль доступен только для CLI-приложений. Исходя из этого, многопоточность в PHP в окружении веб-сервера недоступна.

Внимание

pthreads (v3) может использоваться только с PHP 7.2 и выше, так как ZTS-режим нестабилен в 7.0 и 7.1.

Класс Threaded предоставляет базовый функционал, необходимый для работы pthreads. Он предоставляет методы синхронизации и некоторые полезные для разработчика интерфейсы.

Класс Thread позволяет создавать потоки. Для создания потока необходимо создать наследующие его класс и в нём реализовать метод `run`. Любые свойства могут быть записаны и прочитаны из любого контекста через ссылку на поток. Также из любого контекста могут быть вызваны публичные и защищённые методы. Метод run будет запущен в отдельном потоке, как только будет вызван метод Thread::start() из контекста, в котором он был создан. Стартовать и присоединить поток можно только в том контексте, где он был создан.

Класс Worker имеет постоянное состояние и будет доступен из метода Thread::start() (унаследованный метод) до тех пор, пока объект не выйдет из области видимости, либо пока не будет принудительно остановлен (с помощью Worker::shutdown()). Любой контекст имеющий ссылку к данному объекту может добавлять задания на стек Worker (с помощью Worker::stack()), которые будут запущены в отдельном потоке. Метод `run` объекта Worker будет запущен раньше, чем любой объект с его стека задач, что даёт возможность инициализировать необходимые для задачи ресурсы.

Класс Pool используется для создания группы исполнителей (worker) для распределения между ними объектов Threaded. Это самый простой и эффективный вариант использования многопоточности в PHP.

Предостережение

Класс Pool не наследует Threaded, таким образом являясь обычным объектом PHP. Объекты этого класса не должны разделяться по различным контекстам.

Класс Volatile добавлен в pthreads v3. Он используется для задания изменяемых Threaded-свойств классов типа Threaded (так как теперь они по умолчанию неизменяемы). Также используется для хранения массивов PHP в контексте Threaded.

Синхронизация - важная часть многопоточности. Все объекты, созданные pthreads, имеют встроенные методы для обеспечения синхронизации (они покажутся очень знакомыми для разработчиков на Java): Threaded::wait() и Threaded::notify(). Вызов Threaded::wait() переведёт объект в ожидание до того момента, пока из другого контекста не будет вызван Threaded::notify() для ожидающего объекта. Этот механизм позволяет осуществлять синхронизацию между объектами Threaded.

Предостережение

Любые объекты вашего приложения, которые предполагается использовать в многопоточном режиме, должны наследовать Threaded.

Хранение данных: Как правило, в объекте Threaded можно использовать любые данные, которые могут быть сериализованы. Они могут быть записаны и прочтены из любого контекста через ссылку на этот объект. Не каждый тип данных хранится в сериализованном виде. Базовые типы хранятся в их истинной форме. Сложные типы, массивы и объекты , не являющиеся Threaded, хранятся сериализованными; они могут быть прочитаны или записаны в Threaded-объект из любого контекста по ссылке. За исключением Threaded-объектов, все ссылки, использующиеся для установки свойства в Threaded-объекте отделены от ссылок внутри Threaded-объекте. Чтение тех же данных можно производить напрямую из любого контекста по ссылке на Threaded-объекте.

Статические свойства: Когда создаётся новый контекст (Thread или Worker), они просто копируются, но ресурсы и объекты обнуляются (из соображения безопасности). Это позволяет использовать их как локальные для потока хранилища. К примеру, во время создания контекста, для класса, статические свойства которого хранят информацию о соединении к БД и само соединение, будет скопирована только информация необходимая для соединения, но не само соединение. Это позволит создать новое соединение в новом контексте и сохранить его в том же месте никак не затрагивая оригинальный контекст.

Предостережение

Когда запускаются print_r, var_dump или другие отладочные функции, они не включают защиту от рекурсии.

> Замечание: Ресурсы: Модули и функциональность PHP, создающие ресурсы, совершенно не подготовлены для такого типа окружения; pthreads предоставляет механизм разделения ресурсов между контекстами, однако для большинства типов ресурсов его следует считать небезопасным. Разделяя ресурс между контекстами необходимо быть крайне внимательным и осторожным.

Предостережение

В окружении, где запускается pthreads, необходимы некоторые ограничения и запреты для обеспечения стабильности.

- Установка и настройка
  - Требования
  - Установка
- Предопределённые константы
- Threaded — Класс Threaded
  - Threaded::chunk — Обработка
  - Threaded::count — Обработка
  - Threaded::extend — Обработка во время выполнения
  - Threaded::isRunning — Определяет состояние
  - Threaded::isTerminated — Определение состояния
  - Threaded::merge — Обработка
  - Threaded::notify — Синхронизация
  - Threaded::notifyOne — Синхронизация
  - Threaded::pop — Обработка
  - Threaded::run — Выполнение
  - Threaded::shift — Обработка
  - Threaded::synchronized — Синхронизация
  - Threaded::wait — Синхронизация
- Thread — Класс Thread
  - Thread::getCreatorId — Идентификация
  - Thread::getCurrentThread — Идентификация
  - Thread::getCurrentThreadId — Идентификация
  - Thread::getThreadId — Идентификация
  - Thread::isJoined — Определение состояния
  - Thread::isStarted — Определение состояния
  - Thread::join — Синхронизация
  - Thread::start — Выполнение
- Worker — Класс Worker
  - Worker::collect — Собрать ссылки на завершённые задачи
  - Worker::getStacked — Возвращает текущий размер стека
  - Worker::isShutdown — Определение состояния
  - Worker::shutdown — Остановить Worker
  - Worker::stack — Положить задачу на стек
  - Worker::unstack — Убирает задачу из стека
- Collectable — Интерфейс Collectable
  - Collectable::isGarbage — Определяет, помечен ли объект как мусор
- Pool — Класс Pool
  - Pool::collect — Собирает ссылки на выполненные задания
  - Pool::__construct — Создаёт новый пул воркеров
  - Pool::resize — Изменяет размер пула
  - Pool::shutdown — Выключает все воркеры
  - Pool::submit — Отправляет объект на исполнение
  - Pool::submitTo — Отправляет задачу конкретному воркеру для выполнения
- Volatile — Класс Volatile

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open