aio-libs / aiodns

Simple DNS resolver for asyncio
https://pypi.python.org/pypi/aiodns
MIT License
538 stars 69 forks source link

NotImplementedError on Windows #86

Closed oyarsa closed 1 year ago

oyarsa commented 4 years ago

I tried running the example code on the README, and got this error:

From cffi callback <function _sock_state_cb at 0x00000240DB1BEC10>:
Traceback (most recent call last):
  File "C:\Users\italo\Google Drive\Code\Projects\email-lists\env\lib\site-packages\pycares\__init__.py", line 91, in _sock_state_cb
    sock_state_cb(socket_fd, readable, writable)
  File "C:\Users\italo\Google Drive\Code\Projects\email-lists\env\lib\site-packages\aiodns\__init__.py", line 104, in _sock_state_cb
    self.loop.add_reader(fd, self._handle_event, fd, READ)
  File "C:\Users\italo\AppData\Local\Programs\Python\Python38\lib\asyncio\events.py", line 501, in add_reader
    raise NotImplementedError
NotImplementedError

The program hung after that. After interrupting it, this is the traceback:

Traceback (most recent call last):
  File "a.py", line 11, in <module>
    result = loop.run_until_complete(coro)
  File "C:\Users\italo\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "C:\Users\italo\AppData\Local\Programs\Python\Python38\lib\asyncio\windows_events.py", line 316, in run_forever
    super().run_forever()
  File "C:\Users\italo\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
  File "C:\Users\italo\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 1823, in _run_once
    event_list = self._selector.select(timeout)
  File "C:\Users\italo\AppData\Local\Programs\Python\Python38\lib\asyncio\windows_events.py", line 430, in select
    self._poll(timeout)
  File "C:\Users\italo\AppData\Local\Programs\Python\Python38\lib\asyncio\windows_events.py", line 779, in _poll
    status = _overlapped.GetQueuedCompletionStatus(self._iocp, ms)
KeyboardInterrupt

This is on Windows 10 build 2004 with Python 3.8.5 and aiodns 2.0.0.

P0oOOOo0YA commented 3 years ago

Having the same problem on windows. So the workaround would be to run this under WSL.

abersheeran commented 3 years ago

Same problem in CPython3.9 on windows10.

joggraphy commented 3 years ago

Exactly the same problem on Python 3.9.4 on Windows 10 using the example program. Any suggestions?

FredericMa commented 3 years ago

I'm having the same issue.

BiDuang commented 1 year ago

Still got problem on Windows 10 with python3.9.5 and Windows 11 with python 3.10

saghul commented 1 year ago

c-ares, what is used underneath, requires a readyness style API, which is not supported on Windows unless you are using a SelectorEventLoop implementation: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.SelectorEventLoop

BiDuang commented 1 year ago

Okay, thanks. By the way, I made an improvement to let other users know about this issue, and merge it if you think it's good. #105

g-regor commented 1 year ago

In user code, it can be solved by adding

if sys.platform == 'win32':
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

Maybe it should be part of the example?

saghul commented 1 year ago

Oh that's nice! When did they add to Python?

Happy to take a PR if you're up for it!

g-regor commented 1 year ago

WindowsSelectorEventLoopPolicy was added in 3.7

In 3.8 the default event loop for windows was changed to ProactorEventLoop. At which point this became necessary.

Seems this was already discussed in #78

ruidazeng commented 2 weeks ago

What does this mean....

  File "C:\Users\RAZEER\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiohttp\resolver.py", line 95, in __init__
    self._resolver = aiodns.DNSResolver(*args, **kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\RAZEER\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiodns\__init__.py", line 60, in __init__
    raise RuntimeError(
RuntimeError: aiodns needs a SelectorEventLoop on Windows. See more: https://github.com/saghul/aiodns/issues/86
g-regor commented 2 weeks ago

What does this mean....

  File "C:\Users\RAZEER\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiohttp\resolver.py", line 95, in __init__
    self._resolver = aiodns.DNSResolver(*args, **kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\RAZEER\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiodns\__init__.py", line 60, in __init__
    raise RuntimeError(
RuntimeError: aiodns needs a SelectorEventLoop on Windows. See more: https://github.com/saghul/aiodns/issues/86

Did you read this thread? Or the README?

ruidazeng commented 2 weeks ago

What does this mean....

  File "C:\Users\RAZEER\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiohttp\resolver.py", line 95, in __init__
    self._resolver = aiodns.DNSResolver(*args, **kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\RAZEER\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiodns\__init__.py", line 60, in __init__
    raise RuntimeError(
RuntimeError: aiodns needs a SelectorEventLoop on Windows. See more: https://github.com/saghul/aiodns/issues/86

Did you read this thread? Or the README?

Fixed thank you!