"""Test context switching performance of threading and eventlet""" import threading import time import eventlet from eventlet import hubs from eventlet.hubs import pyevent, epolls, poll, selects CONTEXT_SWITCHES = 100000 def run(event, wait_event): counter = 0 while counter <= CONTEXT_SWITCHES: wait_event.wait() wait_event.reset() counter += 1 event.send() def test_eventlet(): event1 = eventlet.event.Event() event2 = eventlet.event.Event() event1.send() thread1 = eventlet.spawn(run, event1, event2) thread2 = eventlet.spawn(run, event2, event1) thread1.wait() thread2.wait() class BenchThread(threading.Thread): def __init__(self, event, wait_event): threading.Thread.__init__(self) self.counter = 0 self.event = event self.wait_event = wait_event def run(self): while self.counter <= CONTEXT_SWITCHES: self.wait_event.wait() self.wait_event.clear() self.counter += 1 self.event.set() def test_thread(): event1 = threading.Event() event2 = threading.Event() event1.set() thread1 = BenchThread(event1, event2) thread2 = BenchThread(event2, event1) thread1.start() thread2.start() thread1.join() thread2.join() print "Testing with %d context switches" % CONTEXT_SWITCHES start = time.time() test_thread() print "threading: %.02f seconds" % (time.time() - start) try: hubs.use_hub(pyevent) start = time.time() test_eventlet() print "pyevent: %.02f seconds" % (time.time() - start) except: print "pyevent hub unavailable" try: hubs.use_hub(epolls) start = time.time() test_eventlet() print "epoll: %.02f seconds" % (time.time() - start) except: print "epoll hub unavailable" try: hubs.use_hub(poll) start = time.time() test_eventlet() print "poll: %.02f seconds" % (time.time() - start) except: print "poll hub unavailable" try: hubs.use_hub(selects) start = time.time() test_eventlet() print "select: %.02f seconds" % (time.time() - start) except: print "select hub unavailable"