Optimize events with single handler
This commit is contained in:
1 parent
c41b3a612a
commit
59a718be20
1 file changed
+20
-6
@@ -55,11 +55,6 @@ def removeEvent(name, handler):
|
|||||||
def fireEvent(name, *args, **kwargs):
|
def fireEvent(name, *args, **kwargs):
|
||||||
if not events.has_key(name): return
|
if not events.has_key(name): return
|
||||||
|
|
||||||
e = Event(name = name, threads = 10, asynch = kwargs.get('async', False), exc_info = True, traceback = True, lock = threading.RLock())
|
|
||||||
|
|
||||||
for event in events[name]:
|
|
||||||
e.handle(event['handler'], priority = event['priority'])
|
|
||||||
|
|
||||||
#log.debug('Firing event %s', name)
|
#log.debug('Firing event %s', name)
|
||||||
try:
|
try:
|
||||||
|
|
||||||
@@ -69,7 +64,6 @@ def fireEvent(name, *args, **kwargs):
|
|||||||
'single': False, # Return single handler
|
'single': False, # Return single handler
|
||||||
'merge': False, # Merge items
|
'merge': False, # Merge items
|
||||||
'in_order': False, # Fire them in specific order, waits for the other to finish
|
'in_order': False, # Fire them in specific order, waits for the other to finish
|
||||||
'async': False
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Do options
|
# Do options
|
||||||
@@ -80,6 +74,26 @@ def fireEvent(name, *args, **kwargs):
|
|||||||
options[x] = val
|
options[x] = val
|
||||||
except: pass
|
except: pass
|
||||||
|
|
||||||
|
if len(events[name]) == 1:
|
||||||
|
|
||||||
|
single = None
|
||||||
|
try:
|
||||||
|
single = events[name][0]['handler'](*args, **kwargs)
|
||||||
|
except:
|
||||||
|
log.error('Failed running single event: %s', traceback.format_exc())
|
||||||
|
|
||||||
|
# Don't load thread for single event
|
||||||
|
result = {
|
||||||
|
'single': (single is not None, single),
|
||||||
|
}
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
e = Event(name = name, threads = 10, exc_info = True, traceback = True, lock = threading.RLock())
|
||||||
|
|
||||||
|
for event in events[name]:
|
||||||
|
e.handle(event['handler'], priority = event['priority'])
|
||||||
|
|
||||||
# Make sure only 1 event is fired at a time when order is wanted
|
# Make sure only 1 event is fired at a time when order is wanted
|
||||||
kwargs['event_order_lock'] = threading.RLock() if options['in_order'] or options['single'] else None
|
kwargs['event_order_lock'] = threading.RLock() if options['in_order'] or options['single'] else None
|
||||||
kwargs['event_return_on_result'] = options['single']
|
kwargs['event_return_on_result'] = options['single']
|
||||||
|
|||||||
Reference in new issue
Block a user