event loop based on greenlet