Optimize events with single handler
This commit is contained in:
+25
-11
@@ -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,12 +74,32 @@ def fireEvent(name, *args, **kwargs):
|
|||||||
options[x] = val
|
options[x] = val
|
||||||
except: pass
|
except: pass
|
||||||
|
|
||||||
# Make sure only 1 event is fired at a time when order is wanted
|
if len(events[name]) == 1:
|
||||||
kwargs['event_order_lock'] = threading.RLock() if options['in_order'] or options['single'] else None
|
|
||||||
kwargs['event_return_on_result'] = options['single']
|
|
||||||
|
|
||||||
# Fire
|
single = None
|
||||||
result = e(*args, **kwargs)
|
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
|
||||||
|
kwargs['event_order_lock'] = threading.RLock() if options['in_order'] or options['single'] else None
|
||||||
|
kwargs['event_return_on_result'] = options['single']
|
||||||
|
|
||||||
|
# Fire
|
||||||
|
result = e(*args, **kwargs)
|
||||||
|
|
||||||
if options['single'] and not options['merge']:
|
if options['single'] and not options['merge']:
|
||||||
results = None
|
results = None
|
||||||
|
|||||||
Reference in New Issue
Block a user