All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
0.3.0 - 2016-01-15
- Added
Icicle\Concurrent\Worker\factory()
function that accesses or sets the global worker factory. - Added
Icicle\Concurrent\Worker\get()
function that returns a worker from the global worker pool.
Icicle\Concurrent\Worker\Environment
is now an interface, withIcicle\Concurrent\Worker\BasicEnvironment
being the default implementation provided to workers that is then provided toIcicle\Concurrent\Worker\Task::run()
. Workers with different implementations ofEnvironment
can be easily created for particular applications.Icicle\Concurrent\Worker\Queue
has been removed. The functionality of queues has been merged intoIcicle\Concurrent\Worker\Pool
through a newget()
method that returns a worker from the pool. The returned worker is marked as busy until all references have been destroyed. See the example code below.
use Icicle\Concurrent\Worker\DefaultPool;
$pool = new DefaultPool();
$pool->start();
$worker = $pool->get(); // Marks $worker as busy in the pool.
// Use $worker for a series of tasks.
$worker = null; // Marks worker as idle in the pool.
0.2.2 - 2015-12-21
- Added the
Icicle\Concurrent\Strand
interface that combinesIcicle\Concurrent\Context
andIcicle\Concurrent\Sync\Channel
. This interface is implemented by the following classes (note that these classes implemented the two component interface separately, so no changes were made to the implementation):Icicle\Concurrent\Forking\Fork
Icicle\Concurrent\Threading\Thread
Icicle\Concurrent\Process\ChannelledProcess
Icicle\Concurrent\Strand
interface is now required by the constructor ofIcicle\Concurrent\Worker\AbstractWorker
.
0.2.1 - 2015-12-16
- Added
Icicle\Concurrent\Worker\DefaultQueue
implementingIcicle\Concurrent\Worker\Queue
that provides a queue of workers that can be pulled and pushed from the queue as needed. Pulling a worker marks it as busy and pushing the worker back into the queue marks it as idle. If no idle workers remain in the queue, a worker is selected from those marked as busy. A worker queue allows a set of interdependent tasks (for example, tasks that depend on an environment value in the worker) to be run on a single worker without having to create and start separate workers for each task.
- Fixed bug where exit status was not being read in
Icicle\Concurrent\Process\Process
, which also causedIcicle\Concurrent\Worker\WorkerProcess
to fail.
0.2.0 - 2015-12-13
- Updated to Icicle
0.9.x
packages. - All exceptions now implement the
Icicle\Exception\Throwable
interface. - All interface names have been changed to remove the Interface suffix.
Sync\Channel
was renamed toSync\ChannelledStream
.Sync\Parcel
was renamed toSync\SharedMemoryParcel
.Worker\Worker
has been renamed toWorker\AbstractWorker
.Worker\Pool
has been renamed toWorker\DefaultPool
.Worker\WorkerFactory
is now an interface, with the default implementation asWorker\DefaultWorkerFactory
.
- Fixed bug where workers would begin throwing
BusyError
s when tasks are enqueued simultaneously or between multiple coroutines. - Fixed bugs with worker shutdowns conflicting with tasks already running.
- Fixed race conditions with pools occurring when enqueuing many tasks at once.
- Fixed issue with contexts failing without explanation if the returned value could not be serialized.
0.1.1 - 2015-11-13
- Runtime support for forks and threads can now be checked with
Forking\Fork::enabled()
andThreading\Thread::enabled()
, respectively.
- Creating a fork will now throw an
UnsupportedError
if forking is not available. - Creating a thread will now throw an
UnsupportedError
if threading is not available. - Creating a
Sync\Parcel
will now throw anUnsupportedError
if theshmop
extension is not enabled. - Creating a
Sync\PosixSemaphore
will now throw anUnsupportedError
if thesysvmsg
extension is not enabled.
- Fixed
Worker\Pool::__construct()
using$minSize
as the maximum pool size instead. Process\Process
no longer reports as running during process destruction after callingkill()
.
0.1.0 - 2015-10-28
Sync\ParcelInterface::wrap()
was removed in favor ofsynchronized()
, which now passes the value of the parcel to the callback function. The value returned by the callback will be wrapped.- Both channel interfaces were combined into
Sync\Channel
. ContextInterface
no longer extends a channel interfaceForking\Fork
andProcess\Process
now implementProcessInterface
.- Updated
icicleio/stream
to v0.4.1.
- Fixed issue with error handler in
Sync\Channel
catching unrelated errors until the next tick.
0.1.0-beta1 - 2015-09-28
First release.
- Creating and controlling multiple threads with
Threading\Thread
. - Creating and controlling multiple forked processes with
Forking\Fork
. - Workers and tasks, which can use either threading, forks, or a separate PHP process.
- A global worker pool that any tasks can be run in.
- Channels for sending messages across execution contexts.
- Parcels for storing values and objects in shared memory locations for use across contexts.
- Non-blocking mutexes and semaphores for protecting parcels.