首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RuntimeError:传输使用文件描述符8

RuntimeError:传输使用文件描述符8
EN

Stack Overflow用户
提问于 2019-07-25 11:30:45
回答 1查看 499关注 0票数 1

最小演示示例:

代码语言:javascript
复制
import asyncio

async def main():
    c1_reader, c1_writer = await asyncio.open_connection(host='google.com', port=80)
    c1_socket = c1_writer.get_extra_info('socket')
    c1_socket.close()

    c2_reader, c2_writer = await asyncio.open_connection(host='google.com', port=80)

asyncio.run(main())

运行此程序将产生以下错误:

代码语言:javascript
复制
$ python3 asyncio_fd_used.py
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/selector_events.py", line 469, in _sock_connect
    sock.connect(address)
BlockingIOError: [Errno 36] Operation now in progress

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "asyncio_fd_used.py", line 11, in <module>
    asyncio.run(main())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 579, in run_until_complete
    return future.result()
  File "asyncio_fd_used.py", line 9, in main
    c2_reader, c2_writer = await asyncio.open_connection(host='google.com', port=80)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/streams.py", line 77, in open_connection
    lambda: protocol, host, port, **kwds)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 941, in create_connection
    await self.sock_connect(sock, address)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/selector_events.py", line 463, in sock_connect
    self._sock_connect(fut, sock, address)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/selector_events.py", line 477, in _sock_connect
    self.add_writer(fd, self._sock_connect_cb, fut, sock, address)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/selector_events.py", line 333, in add_writer
    self._ensure_fd_no_transport(fd)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/selector_events.py", line 244, in _ensure_fd_no_transport
    f'File descriptor {fd!r} is used by transport '
RuntimeError: File descriptor 8 is used by transport <_SelectorSocketTransport fd=8 read=polling write=<idle, bufsize=0>>

为了解释我为什么要做低级别的socket.close()而不是异步级的writer.close():我尝试了一些代码来发送RST数据包。但我可以想象出人们打电话给socket.close()的其他原因,甚至可能是无意中的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-25 11:30:45

问题是低级别的套接字是关闭的,但是异步不知道,并且认为它仍然是开放的。出于某种原因(表现?)异步记忆套接字文件描述符(fileno)。

当打开一个新连接时,操作系统给它提供相同的文件描述符号,异步开始恐慌,因为它与之前的连接有相同的fd号。

解决方案:告诉异步程序套接字已关闭:)

代码语言:javascript
复制
import asyncio

async def main():
    c1_reader, c1_writer = await asyncio.open_connection(host='google.com', port=80)
    c1_socket = c1_writer.get_extra_info('socket')
    c1_socket.close()
    c1_writer.close()  # <<< here

    c2_reader, c2_writer = await asyncio.open_connection(host='google.com', port=80)

asyncio.run(main())

运行此代码时不会引发错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57200946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档