Skip to content

add_reader not functioning the same as asyncio version #97

Closed
@kura

Description

@kura
  • uvloop version: 0.8.0
  • Python version: 3.6.1
  • Platform: Debian 9
  • Can you reproduce the bug with PYTHONASYNCIODEBUG in env?: yes

I lifted a threaded controller from another project to use during testing.

class Controller:

    def __init__(self, sock=None, loop=None):
        if sock is not None:
            self.sock = sock
        else:
            self.sock = _socket('127.0.0.1', 0, socket.AF_INET)
        self.server = None
        self.loop = asyncio.new_event_loop() if loop is None else loop
        self.thread = None
        self._rsock, self._wsock = socket.socketpair()
        self.loop.add_reader(self._rsock, self._reader)

    def _reader(self):
        self.loop.remove_reader(self._rsock)
        self.loop.stop()
        for task in asyncio.Task.all_tasks(self.loop):
            task.cancel()
        self._rsock.close()
        self._wsock.close()

    def _run(self, ready_event):
        asyncio.set_event_loop(self.loop)
        conf = Config(None)
        conf.mailname = 'blackhole.io'
        _server = self.loop.create_server(lambda: Smtp([]),
                                          sock=self.sock)
        self.server = self.loop.run_until_complete(_server)
        self.loop.call_soon(ready_event.set)
        self.loop.run_forever()
        self.server.close()
        self.loop.run_until_complete(self.server.wait_closed())
        self.sock.close()
        self.loop.close()

    def start(self):
        ready_event = threading.Event()
        self.thread = threading.Thread(target=self._run, args=(ready_event, ))
        self.thread.daemon = True
        self.thread.start()
        ready_event.wait()

    def stop(self):
        self._wsock.send(b'x')
        self.thread.join()

The line self.loop.add_reader(self._rsock, self._reader) fails because uvloop's add_reader expects the first argument to be a file descriptor whereas asyncio allows a socket to be passed, in this case from socket.socketpair().

I have since updated this piece of code to remove using a socket to kill the thread after testing is complete.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions