在Python中关闭asyncio事件循环最终导致异常

格林纳

对于在Windows上的Python 3.4中使用asyncio和aiohttp的https请求,我需要使用2个事件循环。一个ProactorEventLoop,用于运行Shell命令,以及用于HTTPS请求的默认事件循环。不幸的是,ProactorEventLoop不适用于HTTPS命令。

下面的代码显示了当我使用新创建的默认事件循环并尝试在Windows上最终将其关闭时发生的情况。如果我loop.close在末尾调用,则在末尾出现异常,如下所示:

> Traceback (most recent call last):
>  File "C:\BuildUtilities\p3.4env0\lib\site-packages\aiohttp\connector.py", line 56, in __del__
>    self.close()
>  File "C:\BuildUtilities\p3.4env0\lib\site-packages\aiohttp\connector.py", line 97, in close
>    transport.close()
>  File "C:\Python34\Lib\asyncio\selector_events.py", line 375, in close
>    self._loop.remove_reader(self._sock_fd)
>  File "C:\Python34\Lib\asyncio\selector_events.py", line 155, in remove_reader
>    key = self._selector.get_key(fd)
> AttributeError: 'NoneType' object has no attribute 'get_key'

注释掉它会删除该异常,我不知道为什么。唯一的

import asyncio
import aiohttp

@asyncio.coroutine
def get_body(url):
    response = yield from aiohttp.request('GET', url)
    return (yield from response.read_and_close())

#loop = asyncio.ProactorEventLoop()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

f = asyncio.async( get_body('https://www.google.com') )
try:
    loop.run_until_complete(f)
except Exception as e:
    print(e)

if f.result():
    print(f.result())

loop.close()

谢谢,greenaj

杰夫斯

更新:看起来该问题已在github版本(0.7.2)中修复。它不会产生错误。正如@ danj.py所说,它是通过“摆脱__del__连接器” commit来解决的


它不是ProactorEventLoop或Windows特定的。我可以使用默认事件循环在Ubuntu上重现该错误:

#!/usr/bin/env python3
import asyncio
import aiohttp # $ pip install aiohttp

@asyncio.coroutine
def get_body(url):
    response = yield from aiohttp.request('GET', url)
    return (yield from response.read_and_close())

loop = asyncio.get_event_loop()
body = loop.run_until_complete(get_body('https://stackoverflow.com/q/23283502'))
print(len(body), type(body), body[:200])
loop.close()

这可能是aiohttp中的错误,因为用法似乎正确。

如果发出的请求没有以下内容,则没有错误aiohttp

#!/usr/bin/env python3
import asyncio
from contextlib import closing
from urllib.parse import urlsplit

@asyncio.coroutine
def get_body(url):
    # parse url
    url = urlsplit(url)
    path = '/' * (not url.path) + url.path + '?' * bool(url.query) + url.query
    # open connection
    reader, writer = yield from asyncio.open_connection(
        host=url.hostname,
        port=url.port or (443 if url.scheme == 'https' else 80),
        ssl=(url.scheme == 'https'))
    with closing(writer):
        # send request
        writer.write(b'GET ' + path.encode('ascii') + b' HTTP/1.1\r\n'
                     b'Host: ' + url.netloc.encode('ascii') + b'\r\n'
                     b'Connection: close\r\n\r\n')
        # read headers
        while True:
            line = yield from reader.readline()
            line = line.rstrip(b'\n\r')
            print(line.decode('latin-1'))
            if not line:
                break
        # read body
        body = yield from reader.read()
    return body

loop = asyncio.get_event_loop()
body = loop.run_until_complete(get_body('https://stackoverflow.com/q/23283502'))
print(len(body), type(body), body[:200])
loop.close()

注意:这些示例并不完全等效,例如,后者不遵循重定向。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在python 3.8中使用aiohttp和asyncio关闭异常事件循环

来自分类Dev

带有python asyncio的AWS Lambda。事件循环关闭问题?

来自分类Dev

RuntimeError:事件循环在异步python中关闭

来自分类Dev

RuntimeError:事件循环在异步python中关闭

来自分类Dev

SqlConnection构造函数中的异常导致最终确定中的异常

来自分类Dev

Python Asyncio错误:“ OSError:[WinError 6]句柄无效”和“ RuntimeError:事件循环已关闭”

来自分类Dev

每个python进程的Asyncio事件循环(aioprocessing,多个事件循环)

来自分类Dev

Python Discord Bot'事件循环已关闭'

来自分类Dev

python asyncio运行事件循环一次?

来自分类Dev

对话框的关闭事件触发焦点事件并导致无限循环

来自分类Dev

使用asyncio时,如何在关闭事件循环之前让所有正在运行的任务完成

来自分类Dev

使用 pytest-asyncio 测试通道 2.0 获取 RuntimeError:事件循环已关闭

来自分类Dev

Python3 asyncio生成新线程时线程中没有当前事件循环

来自分类Dev

RuntimeError:连接python discord bot时事件循环关闭

来自分类Dev

循环减慢加班速度,最终导致在HTMLs中运行的Javascipt崩溃

来自分类Dev

无法在Eclipse中编译-未处理的事件循环异常

来自分类Dev

在Python asyncio任务中处理未处理的异常后整理

来自分类Dev

asyncio / aiohttp-create_task()阻止事件循环,在“此事件循环已在运行”中收集结果

来自分类Dev

从关闭的NetworkStream读取不会导致任何异常

来自分类Dev

如何测量asyncio事件循环的长度?

来自分类Dev

释放surfaceChanged中的相机对象会导致强制关闭(空指针异常)

来自分类Dev

python 3.7.5:asyncio.get_event_loop没有创建事件循环

来自分类Dev

如何学习如何实现自定义Python asyncio事件循环?

来自分类Dev

没有 asyncio 的 Python 3.6 异步等待:如何编写自己最简单的事件循环?

来自分类Dev

asyncio 中的事件循环溢出。虽然一次添加 4 个执行,但它是超载的

来自分类Dev

使用d3.js键锁定事件处理程序关闭中的联接导致内存泄漏

来自分类Dev

GoJS-Click事件的异常行为,“ this”最终为null

来自分类Dev

关闭扫描仪导致无限循环

来自分类Dev

最终在 RSpec 中抛出异常的测试方法

Related 相关文章

  1. 1

    在python 3.8中使用aiohttp和asyncio关闭异常事件循环

  2. 2

    带有python asyncio的AWS Lambda。事件循环关闭问题?

  3. 3

    RuntimeError:事件循环在异步python中关闭

  4. 4

    RuntimeError:事件循环在异步python中关闭

  5. 5

    SqlConnection构造函数中的异常导致最终确定中的异常

  6. 6

    Python Asyncio错误:“ OSError:[WinError 6]句柄无效”和“ RuntimeError:事件循环已关闭”

  7. 7

    每个python进程的Asyncio事件循环(aioprocessing,多个事件循环)

  8. 8

    Python Discord Bot'事件循环已关闭'

  9. 9

    python asyncio运行事件循环一次?

  10. 10

    对话框的关闭事件触发焦点事件并导致无限循环

  11. 11

    使用asyncio时,如何在关闭事件循环之前让所有正在运行的任务完成

  12. 12

    使用 pytest-asyncio 测试通道 2.0 获取 RuntimeError:事件循环已关闭

  13. 13

    Python3 asyncio生成新线程时线程中没有当前事件循环

  14. 14

    RuntimeError:连接python discord bot时事件循环关闭

  15. 15

    循环减慢加班速度,最终导致在HTMLs中运行的Javascipt崩溃

  16. 16

    无法在Eclipse中编译-未处理的事件循环异常

  17. 17

    在Python asyncio任务中处理未处理的异常后整理

  18. 18

    asyncio / aiohttp-create_task()阻止事件循环,在“此事件循环已在运行”中收集结果

  19. 19

    从关闭的NetworkStream读取不会导致任何异常

  20. 20

    如何测量asyncio事件循环的长度?

  21. 21

    释放surfaceChanged中的相机对象会导致强制关闭(空指针异常)

  22. 22

    python 3.7.5:asyncio.get_event_loop没有创建事件循环

  23. 23

    如何学习如何实现自定义Python asyncio事件循环?

  24. 24

    没有 asyncio 的 Python 3.6 异步等待:如何编写自己最简单的事件循环?

  25. 25

    asyncio 中的事件循环溢出。虽然一次添加 4 个执行,但它是超载的

  26. 26

    使用d3.js键锁定事件处理程序关闭中的联接导致内存泄漏

  27. 27

    GoJS-Click事件的异常行为,“ this”最终为null

  28. 28

    关闭扫描仪导致无限循环

  29. 29

    最终在 RSpec 中抛出异常的测试方法

热门标签

归档