Filter sequence of receivers to get resolved, live receivers. This checks for weak references and resolves them, then returning only live receivers.
(self, sender)
| 474 | ] |
| 475 | |
| 476 | def _live_receivers(self, sender): |
| 477 | """ |
| 478 | Filter sequence of receivers to get resolved, live receivers. |
| 479 | |
| 480 | This checks for weak references and resolves them, then returning only |
| 481 | live receivers. |
| 482 | """ |
| 483 | receivers = None |
| 484 | if self.use_caching and not self._dead_receivers: |
| 485 | receivers = self.sender_receivers_cache.get(sender) |
| 486 | # We could end up here with NO_RECEIVERS even if we do check this |
| 487 | # case in .send() prior to calling _live_receivers() due to |
| 488 | # concurrent .send() call. |
| 489 | if receivers is NO_RECEIVERS: |
| 490 | return [], [] |
| 491 | if receivers is None: |
| 492 | with self.lock: |
| 493 | self._clear_dead_receivers() |
| 494 | senderkey = _make_id(sender) |
| 495 | receivers = [] |
| 496 | for ( |
| 497 | (_receiverkey, r_senderkey), |
| 498 | receiver, |
| 499 | sender_ref, |
| 500 | is_async, |
| 501 | ) in self.receivers: |
| 502 | if r_senderkey == NONE_ID or r_senderkey == senderkey: |
| 503 | receivers.append((receiver, sender_ref, is_async)) |
| 504 | if self.use_caching: |
| 505 | if not receivers: |
| 506 | self.sender_receivers_cache[sender] = NO_RECEIVERS |
| 507 | else: |
| 508 | # Note, we must cache the weakref versions. |
| 509 | self.sender_receivers_cache[sender] = receivers |
| 510 | non_weak_sync_receivers = [] |
| 511 | non_weak_async_receivers = [] |
| 512 | for receiver, sender_ref, is_async in receivers: |
| 513 | # Skip if the receiver/sender is a dead weakref |
| 514 | if isinstance(receiver, weakref.ReferenceType): |
| 515 | receiver = receiver() |
| 516 | if receiver is None: |
| 517 | continue |
| 518 | if sender_ref is not None and sender_ref() is None: |
| 519 | continue |
| 520 | if is_async: |
| 521 | non_weak_async_receivers.append(receiver) |
| 522 | else: |
| 523 | non_weak_sync_receivers.append(receiver) |
| 524 | return non_weak_sync_receivers, non_weak_async_receivers |
| 525 | |
| 526 | def _flag_dead_receivers(self, reference=None): |
| 527 | # Mark that the self.receivers list has dead weakrefs. If so, we will |