MCPcopy
hub / github.com/django/django / _live_receivers

Method _live_receivers

django/dispatch/dispatcher.py:476–524  ·  view source on GitHub ↗

Filter sequence of receivers to get resolved, live receivers. This checks for weak references and resolves them, then returning only live receivers.

(self, sender)

Source from the content-addressed store, hash-verified

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

Callers 6

has_listenersMethod · 0.95
sendMethod · 0.95
asendMethod · 0.95
send_robustMethod · 0.95
asend_robustMethod · 0.95

Calls 5

_clear_dead_receiversMethod · 0.95
_make_idFunction · 0.85
receiverFunction · 0.85
getMethod · 0.45
appendMethod · 0.45