Remove stream feature handlers on session_start.
Based on profiling, using around 35 stream handlers quarters the number of basic message stanzas that can be processed in a second, in comparison to only using the bare minimum of four handlers. To help, we can drop handlers for stream features once the session has started. So that we can re-enable these handlers when a stream must restart, the 'stream_start' event has been added which fires whenever a stream header is received. The 'stream_start' event is a more generic replacement for the existing start_stream_handler() method.
This commit is contained in:
@@ -98,13 +98,11 @@ class ClientXMPP(BaseXMPP):
|
||||
|
||||
self.add_event_handler('connected', self._handle_connected)
|
||||
self.add_event_handler('session_bind', self._handle_session_bind)
|
||||
self.add_event_handler('stream_start', self._handle_stream_start)
|
||||
self.add_event_handler('session_start', self._handle_session_start)
|
||||
|
||||
self.register_stanza(StreamFeatures)
|
||||
|
||||
self.register_handler(
|
||||
Callback('Stream Features',
|
||||
MatchXPath('{%s}features' % self.stream_ns),
|
||||
self._handle_stream_features))
|
||||
self.register_handler(
|
||||
Callback('Roster Update',
|
||||
MatchXPath('{%s}iq/{%s}query' % (
|
||||
@@ -119,6 +117,15 @@ class ClientXMPP(BaseXMPP):
|
||||
self.register_plugin('feature_mechanisms',
|
||||
pconfig={'use_mech': sasl_mech} if sasl_mech else None)
|
||||
|
||||
def _handle_stream_start(self, root):
|
||||
self.register_handler(
|
||||
Callback('Stream Features',
|
||||
MatchXPath('{%s}features' % self.stream_ns),
|
||||
self._handle_stream_features))
|
||||
|
||||
def _handle_session_start(self, e):
|
||||
self.remove_handler('Stream Features')
|
||||
|
||||
def connect(self, address=tuple(), reattempt=True,
|
||||
use_tls=True, use_ssl=False):
|
||||
"""Connect to the XMPP server.
|
||||
|
||||
Reference in New Issue
Block a user