|
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