|
14 | 14 | use function Workbunny\WebmanCoroutine\wait_for;
|
15 | 15 |
|
16 | 16 | use Workerman\Worker;
|
| 17 | +use function Workbunny\WebmanCoroutine\wakeup; |
17 | 18 |
|
18 | 19 | class Pool
|
19 | 20 | {
|
@@ -203,11 +204,13 @@ public static function idle(string $name): Pool|null
|
203 | 204 | public static function getIdle(string $name, int $timeout = -1): Pool
|
204 | 205 | {
|
205 | 206 | $pool = null;
|
| 207 | + // 使用pool.idle.$name事件等待空闲对象 |
206 | 208 | wait_for(function () use (&$pool, $name) {
|
207 | 209 | $pool = self::idle($name);
|
208 | 210 |
|
209 | 211 | return $pool !== null;
|
210 |
| - }, $timeout); |
| 212 | + }, timeout: $timeout, event: "pool.idle.$name"); |
| 213 | + // 获取到的对象加锁 |
211 | 214 | $pool->setIdle(false);
|
212 | 215 |
|
213 | 216 | return $pool;
|
@@ -366,6 +369,14 @@ public function isIdle(): bool
|
366 | 369 | public function setIdle(bool $idle): void
|
367 | 370 | {
|
368 | 371 | $this->_idle = $idle;
|
| 372 | + if ($idle) { |
| 373 | + $id = spl_object_hash($this); |
| 374 | + $name = $this->getName(); |
| 375 | + // 唤醒pool.wait.$name.$id |
| 376 | + wakeup("pool.wait.$name.$id"); |
| 377 | + // 唤醒pool.idle.$name |
| 378 | + wakeup("pool.idle.$name"); |
| 379 | + } |
369 | 380 | }
|
370 | 381 |
|
371 | 382 | /**
|
@@ -397,9 +408,12 @@ public function setForce(bool $force): void
|
397 | 408 | */
|
398 | 409 | public function wait(?\Closure $closure = null): void
|
399 | 410 | {
|
| 411 | + $id = spl_object_hash($this); |
| 412 | + $name = $this->getName(); |
| 413 | + // 永久等待pool.wait.$name.$id唤醒事件 |
400 | 414 | wait_for(function () {
|
401 | 415 | return $this->isIdle();
|
402 |
| - }); |
| 416 | + }, timeout: -1, event: "pool.wait.$name.$id"); |
403 | 417 | if ($closure) {
|
404 | 418 | $this->setIdle(false);
|
405 | 419 | try {
|
|
0 commit comments