New GitHub issue #122240 from NoahStapp:<br>
<hr>
<pre>
# Bug report
### Bug description:
`asyncio`'s `loop.sock_sendall()` method causes a Windows `OSError: [WinError 87] The parameter is incorrect` error when using a socket that was created in a different thread. This error only appears when using the default `ProactorEventLoop` on Windows.
Minimum reproducible example:
```python
import asyncio
import threading
import socket
socks = []
async def create_socket():
s = socket.socket()
s.connect(("www.python.org", 80))
s.settimeout(0.0)
loop = asyncio.get_event_loop()
print(f"{threading.current_thread().name}: {await asyncio.wait_for(loop.sock_sendall(s, bytes('hello', 'utf-8')), timeout=5)}")
socks.append(s)
async def use_socket():
while len(socks) < 1:
pass
s = socks.pop()
loop = asyncio.get_event_loop()
print(f"{threading.current_thread().name}: {await asyncio.wait_for(loop.sock_sendall(s, bytes('hello', 'utf-8')), timeout=5)}")
def wrapper(func):
asyncio.run(func())
t1 = threading.Thread(target=wrapper, args=(create_socket,))
t2 = threading.Thread(target=wrapper, args=(use_socket,))
t1.start()
t2.start()
```
Error stacktrace:
```
File "C:\Python312\Lib\threading.py", line 1073, in _bootstrap_inner
self.run()
File "C:\Python312\Lib\threading.py", line 1010, in run
self._target(*self._args, **self._kwargs)
File "C:\cygwin\home\Administrator\mongo-python-driver\windows_test.py", line 27, in wrapper
asyncio.run(func())
File "C:\Python312\Lib\asyncio\runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "C:\Python312\Lib\asyncio\runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python312\Lib\asyncio\base_events.py", line 687, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "C:\cygwin\home\Administrator\mongo-python-driver\windows_test.py", line 23, in use_socket
print(f"{threading.current_thread().name}: {await asyncio.wait_for(loop.sock_sendall(s, bytes('hello
', 'utf-8')), timeout=5)}")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python312\Lib\asyncio\tasks.py", line 520, in wait_for
return await fut
^^^^^^^^^
File "C:\Python312\Lib\asyncio\proactor_events.py", line 721, in sock_sendall
return await self._proactor.send(sock, data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python312\Lib\asyncio\windows_events.py", line 539, in send
self._register_with_iocp(conn)
File "C:\Python312\Lib\asyncio\windows_events.py", line 709, in _register_with_iocp
_overlapped.CreateIoCompletionPort(obj.fileno(), self._iocp, 0, 0)
OSError: [WinError 87] The parameter is incorrect
```
### CPython versions tested on:
3.8, 3.11, 3.12
### Operating systems tested on:
Linux, macOS, Windows
</pre>
<hr>
<a href="https://github.com/python/cpython/issues/122240">View on GitHub</a>
<p>Labels: type-bug</p>
<p>Assignee: </p>