(No version information available, might only be in Git)
Π Swoole 6.0.1 Π΄Π»Ρ ΠΊΠΎΡΡΡΠΈΠ½, ΠΈΠ»ΠΈ ΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΡΡΡΠΈΠ½ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠ½ΡΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΡΡΠ΅Π΄Π°Ρ .
ΠΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ --enable-iouring ΠΈ ΠΏΡΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ΡΠ΄ΡΠΎΠΌ Linux
ΡΡΠ½ΠΊΡΠΈΠΈ io_uring futex ΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Ρ Swoole ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ
ΡΠ΅ΡΠ΅Π· ΡΡΡΡΠ΅ΠΊΡ io_uring. ΠΡΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
ΡΠ΅ΡΠ΅Π· ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ.
ΠΠ΅Π· ΡΡΡΡΠ΅ΠΊΡΠ° io_uring ΠΊΠΎΡΡΡΠΈΠ½Π½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π½Π°ΡΠ°ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ,
ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π° 2^n ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄, Π³Π΄Π΅ n β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΠΊΠ°Π·ΠΎΠ²,
ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΉ ΠΏΠΎΠΏΡΡΠΊΠΈ Π·Π°Ρ
Π²Π°ΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. Π₯ΠΎΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΈΡΠΊΠ»ΡΡΠ°Π΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅,
ΠΎΠ½ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ.
Π‘ΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ΅Π΅Π½ΡΠ΅ΡΠ°Π±Π΅Π»ΡΠ½Π° β ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΉ Π²Ρ ΠΎΠ΄ Π² ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅ΠΊΡΠΈΡ, ΠΈΠ»ΠΈ, Π³ΠΎΠ²ΠΎΡΡ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ, ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π·Π°Ρ Π²Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅ΠΉ ΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.
ΠΡΡΡΠ΅ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² callback-ΡΡΠ½ΠΊΡΠΈΡΡ
Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ onReceive,
ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ Π½Π΅ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌΠΎΠΌΡ ΡΠΎΡΡΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΡΠ΅ΡΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΠ°Ρ Π²Π°Ρ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π² ΡΠΎΠΉ ΠΆΠ΅ ΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΈΠ½Π°ΡΠ΅ Π½Π°ΡΡΡΠ°Π΅ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΠΌΠΈ
<?php
use Swoole\Coroutine\Lock;
use Swoole\Coroutine\WaitGroup;
use function Swoole\Coroutine\go;
use function Swoole\Coroutine\run;
$lock = new Lock();
$waitGroup = new WaitGroup();
run(function() use ($lock, $waitGroup) {
go(function() use ($lock, $waitGroup) {
$waitGroup->add();
$lock->lock();
sleep(1);
$lock->unlock();
$waitGroup->done();
});
go(function() use ($lock, $waitGroup) {
$waitGroup->add();
$lock->lock(); // ΠΠΎΠΆΠ΄Π°ΡΡΡΡ, ΠΏΠΎΠΊΠ° Π΄ΡΡΠ³Π°Ρ ΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ
sleep(1);
$lock->unlock();
$waitGroup->done();
});
echo 'ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΡΡΡ ΠΊΠΎΡΡΡΠΈΠ½Ρ, Π½ΠΎ Π½Π΅ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²Π΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ';
$waitGroup->wait();
});