Eventloop 是什么?是为了解决什么问题而设计的?

Eventloop 是什么?是为了解决什么问题而设计的?

1.请问下,Eventloop 是什么?是为了解决什么问题而设计的?

2.下面是Python 版本的Eventloop 实现示例,这里的Eventloop和Javascript中的Eventloop要解决的问题是一样的吗,有什么区别吗?:

class KqueueLoop(object):

MAX_EVENTS = 1024

def __init__(self):

self._kqueue = select.kqueue()

self._fds = {}

def _control(self, fd, mode, flags):

events = []

if mode & POLL_IN:

events.append(select.kevent(fd, select.KQ_FILTER_READ, flags))

if mode & POLL_OUT:

events.append(select.kevent(fd, select.KQ_FILTER_WRITE, flags))

for e in events:

self._kqueue.control([e], 0)

def poll(self, timeout):

if timeout < 0:

timeout = None # kqueue behaviour

events = self._kqueue.control(None, KqueueLoop.MAX_EVENTS, timeout)

results = defaultdict(lambda: POLL_NULL)

for e in events:

fd = e.ident

if e.filter == select.KQ_FILTER_READ:

results[fd] |= POLL_IN

elif e.filter == select.KQ_FILTER_WRITE:

results[fd] |= POLL_OUT

return results.items()

def register(self, fd, mode):

self._fds[fd] = mode

self._control(fd, mode, select.KQ_EV_ADD)

def unregister(self, fd):

self._control(fd, self._fds[fd], select.KQ_EV_DELETE)

del self._fds[fd]

def modify(self, fd, mode):

self.unregister(fd)

self.register(fd, mode)

def close(self):

self.kqueue.close()

class SelectLoop(object):

def __init__(self):

self._r_list = set()

self._w_list = set()

self._x_list = set()

def poll(self, timeout):

r, w, x = select.select(self._r_list, self._w_list, self._x_list,

timeout)

results = defaultdict(lambda: POLL_NULL)

for p in [(r, POLL_IN), (w, POLL_OUT), (x, POLL_ERR)]:

for fd in p[0]:

results[fd] |= p[1]

return results.items()

def register(self, fd, mode):

if mode & POLL_IN:

self._r_list.add(fd)

if mode & POLL_OUT:

self._w_list.add(fd)

if mode & POLL_ERR:

self._x_list.add(fd)

def unregister(self, fd):

if fd in self._r_list:

self._r_list.remove(fd)

if fd in self._w_list:

self._w_list.remove(fd)

if fd in self._x_list:

self._x_list.remove(fd)

def modify(self, fd, mode):

self.unregister(fd)

self.register(fd, mode)

def close(self):

pass

class EventLoop(object):

def __init__(self):

if hasattr(select, 'epoll'):

self._impl = select.epoll()

model = 'epoll'

elif hasattr(select, 'kqueue'):

self._impl = KqueueLoop()

model = 'kqueue'

elif hasattr(select, 'select'):

self._impl = SelectLoop()

model = 'select'

else:

raise Exception('can not find any available functions in select '

'package')

self._fdmap = {} # (f, handler)

self._last_time = time.time()

self._periodic_callbacks = []

self._stopping = False

logging.debug('using event model: %s', model)

def poll(self, timeout=None):

events = self._impl.poll(timeout)

return [(self._fdmap[fd][0], fd, event) for fd, event in events]

def add(self, f, mode, handler):

fd = f.fileno()

self._fdmap[fd] = (f, handler)

self._impl.register(fd, mode)

def remove(self, f):

fd = f.fileno()

del self._fdmap[fd]

self._impl.unregister(fd)

def add_periodic(self, callback):

self._periodic_callbacks.append(callback)

def remove_periodic(self, callback):

self._periodic_callbacks.remove(callback)

def modify(self, f, mode):

fd = f.fileno()

self._impl.modify(fd, mode)

def stop(self):

self._stopping = True

def run(self):

events = []

while not self._stopping:

asap = False

try:

events = self.poll(TIMEOUT_PRECISION)

except (OSError, IOError) as e:

if errno_from_exception(e) in (errno.EPIPE, errno.EINTR):

# EPIPE: Happens when the client closes the connection

# EINTR: Happens when received a signal

# handles them as soon as possible

asap = True

logging.debug('poll:%s', e)

else:

logging.error('poll:%s', e)

import traceback

traceback.print_exc()

continue

for sock, fd, event in events:

handler = self._fdmap.get(fd, None)

if handler is not None:

handler = handler[1]

try:

handler.handle_event(sock, fd, event)

except (OSError, IOError) as e:

shell.print_exception(e)

now = time.time()

if asap or now - self._last_time >= TIMEOUT_PRECISION:

for callback in self._periodic_callbacks:

callback()

self._last_time = now

def __del__(self):

self._impl.close()

以上是 Eventloop 是什么?是为了解决什么问题而设计的? 的全部内容, 来源链接: utcz.com/a/162404.html

回到顶部