Join 4,000+ others and never miss out on new tips, tutorials, and more.
Latest version:
pecl install openswoole-22.1.2 | composer require openswoole/core:22.1.5
Atomic
can be used for inter-process variable synchronization.
The integer variable defined with Atomic
allows multiple processes access and update it. It is implemented based on CPU atomic instructions. You can use it to implement a high performance counter service with multiple Worker
.
The underlayer implementation is CAS
: Compare-and-swap (CAS) is an atomic instruction used in multi-threading to achieve synchronization. It compares the contents of a memory location with a given value and, only if they are the same, modifies the contents of that memory location to a new given value.
OpenSwoole\Atomic->__construct
OpenSwoole\Atomic\add
OpenSwoole\Atomic\sub
OpenSwoole\Atomic\get
OpenSwoole\Atomic\set
OpenSwoole\Atomic\wait
OpenSwoole\Atomic\wakeup
OpenSwoole\Atomic\cmpset
OpenSwoole\Atomic\Long->__construct
OpenSwoole\Atomic\Long\add
OpenSwoole\Atomic\Long\sub
OpenSwoole\Atomic\Long\get
OpenSwoole\Atomic\Long\set
OpenSwoole\Atomic\Long\cmpset
Atomic
variables have to created before Swoole\Server->start. Then you can access and update it within Worker
.Atomic
within server callbacks like request
, receive
etc.new OpenSwoole\Atomic\Long
to create Int64 type.wait
and wakeup
method is not supported for OpenSwoole\Atomic\Long
<?php
$counter = new OpenSwoole\Atomic(123);
echo $counter->add(12)."\n";
echo $counter->sub(11)."\n";
echo $counter->cmpset(122, 999)."\n";
echo $counter->cmpset(124, 999)."\n";
echo $counter->get()."\n";
<?php
$counter = new OpenSwoole\Atomic();
$server = new OpenSwoole\Server('127.0.0.1', '9501');
$server->set([
'worker_num' => 1,
'log_file' => '/dev/null'
]);
$server->on("start", function ($server) use ($counter) {
if ($counter->add() == 10) {
$server->shutdown();
}
});
$server->on("receive", function () use ($counter) {
$counter->add();
});
$server->start();