Closed
Description
- 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
Labels
No labels