@@ -30,6 +30,9 @@ class Server(object):
3030 packets. Custom json modules must have ``dumps`` and ``loads``
3131 functions that are compatible with the standard library
3232 versions.
33+ :param async_handlers: If set to ``True``, event handlers are executed in
34+ separate threads. To run handlers synchronously,
35+ set to ``False``. The default is ``False``.
3336 :param kwargs: Connection parameters for the underlying Engine.IO server.
3437
3538 The Engine.IO configuration supports the following settings:
@@ -62,14 +65,15 @@ class Server(object):
6265 ``False``.
6366 """
6467 def __init__ (self , client_manager = None , logger = False , binary = False ,
65- json = None , ** kwargs ):
68+ json = None , async_handlers = False , ** kwargs ):
6669 engineio_options = kwargs
6770 engineio_logger = engineio_options .pop ('engineio_logger' , None )
6871 if engineio_logger is not None :
6972 engineio_options ['logger' ] = engineio_logger
7073 if json is not None :
7174 packet .Packet .json = json
7275 engineio_options ['json' ] = json
76+ engineio_options ['async_handlers' ] = False
7377 self .eio = engineio .Server (** engineio_options )
7478 self .eio .on ('connect' , self ._handle_eio_connect )
7579 self .eio .on ('message' , self ._handle_eio_message )
@@ -99,6 +103,8 @@ def __init__(self, client_manager=None, logger=False, binary=False,
99103 self .manager = client_manager
100104 self .manager_initialized = False
101105
106+ self .async_handlers = async_handlers
107+
102108 self .async_mode = self .eio .async_mode
103109
104110 def on (self , event , handler = None , namespace = None ):
@@ -412,7 +418,14 @@ def _handle_event(self, sid, namespace, id, data):
412418 namespace = namespace or '/'
413419 self .logger .info ('received event "%s" from %s [%s]' , data [0 ], sid ,
414420 namespace )
415- r = self ._trigger_event (data [0 ], namespace , sid , * data [1 :])
421+ if self .async_handlers :
422+ self .start_background_task (self ._handle_event_internal , self , sid ,
423+ data , namespace , id )
424+ else :
425+ self ._handle_event_internal (self , sid , data , namespace , id )
426+
427+ def _handle_event_internal (self , server , sid , data , namespace , id ):
428+ r = server ._trigger_event (data [0 ], namespace , sid , * data [1 :])
416429 if id is not None :
417430 # send ACK packet with the response returned by the handler
418431 # tuples are expanded as multiple arguments
@@ -426,10 +439,10 @@ def _handle_event(self, sid, namespace, id, data):
426439 binary = False # pragma: nocover
427440 else :
428441 binary = None
429- self ._send_packet (sid , packet .Packet (packet .ACK ,
430- namespace = namespace ,
431- id = id , data = data ,
432- binary = binary ))
442+ server ._send_packet (sid , packet .Packet (packet .ACK ,
443+ namespace = namespace ,
444+ id = id , data = data ,
445+ binary = binary ))
433446
434447 def _handle_ack (self , sid , namespace , id , data ):
435448 """Handle ACK packets from the client."""
0 commit comments