You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.7 KiB
86 lines
2.7 KiB
6 years ago
|
"""
|
||
|
Posix asyncio event loop.
|
||
|
"""
|
||
|
from __future__ import unicode_literals
|
||
|
|
||
|
from .base import EventLoop
|
||
|
from .context import wrap_in_current_context
|
||
|
from .future import Future
|
||
|
from .utils import ThreadWithFuture
|
||
|
import asyncio
|
||
|
|
||
|
__all__ = [
|
||
|
'PosixAsyncioEventLoop',
|
||
|
]
|
||
|
|
||
|
|
||
|
class PosixAsyncioEventLoop(EventLoop):
|
||
|
"""
|
||
|
Wrapper around the Asyncio event loop, but compatible with prompt_toolkit.
|
||
|
"""
|
||
|
def __init__(self, loop=None):
|
||
|
super(PosixAsyncioEventLoop, self).__init__()
|
||
|
|
||
|
self.loop = loop or asyncio.get_event_loop()
|
||
|
self.closed = False
|
||
|
|
||
|
def close(self):
|
||
|
# Note: we should not close the asyncio loop itself, because that one
|
||
|
# was not created here.
|
||
|
self.closed = True
|
||
|
|
||
|
def run_until_complete(self, future, inputhook=None):
|
||
|
if inputhook:
|
||
|
raise ValueError("PosixAsyncioEventLoop doesn't support input hooks.")
|
||
|
|
||
|
return self.loop.run_until_complete(future)
|
||
|
|
||
|
def run_forever(self, inputhook=None):
|
||
|
if inputhook:
|
||
|
raise ValueError("PosixAsyncioEventLoop doesn't support input hooks.")
|
||
|
|
||
|
self.loop.run_forever()
|
||
|
|
||
|
def run_in_executor(self, callback, _daemon=False):
|
||
|
if _daemon:
|
||
|
# Asyncio doesn't support 'daemon' executors.
|
||
|
th = ThreadWithFuture(callback, daemon=True)
|
||
|
self.call_from_executor(th.start)
|
||
|
return th.future
|
||
|
else:
|
||
|
callback = wrap_in_current_context(callback)
|
||
|
asyncio_f = self.loop.run_in_executor(None, callback)
|
||
|
return Future.from_asyncio_future(asyncio_f, loop=self)
|
||
|
|
||
|
def call_from_executor(self, callback, _max_postpone_until=None):
|
||
|
"""
|
||
|
Call this function in the main event loop.
|
||
|
Similar to Twisted's ``callFromThread``.
|
||
|
"""
|
||
|
callback = wrap_in_current_context(callback)
|
||
|
self.loop.call_soon_threadsafe(callback)
|
||
|
|
||
|
def add_reader(self, fd, callback):
|
||
|
" Start watching the file descriptor for read availability. "
|
||
|
callback = wrap_in_current_context(callback)
|
||
|
self.loop.add_reader(fd, callback)
|
||
|
|
||
|
def remove_reader(self, fd):
|
||
|
" Stop watching the file descriptor for read availability. "
|
||
|
self.loop.remove_reader(fd)
|
||
|
|
||
|
def add_signal_handler(self, signum, handler):
|
||
|
return self.loop.add_signal_handler(signum, handler)
|
||
|
|
||
|
def get_exception_handler(self):
|
||
|
return self.loop.get_exception_handler()
|
||
|
|
||
|
def set_exception_handler(self, handler):
|
||
|
self.loop.set_exception_handler(handler)
|
||
|
|
||
|
def call_exception_handler(self, context):
|
||
|
self.loop.call_exception_handler(context)
|
||
|
|
||
|
def default_exception_handler(self, context):
|
||
|
self.loop.default_exception_handler(context)
|