添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

以下是代码一运行就报错:RuntimeError: Event loop is closed网上找了很多资料的解决方法也都不行,请问哪里的问题?谢谢大家

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
import asyncio
import aiohttp
URL = 'https://www.xiazaiba.com'
async def job(session):
    response = await session.get(URL)
    return str(response.url)
async def main(loop):
    async with aiohttp.ClientSession() as session:
        tasks = [loop.create_task(job(session)) for _ in range(5)]
        finished, unfinished = await asyncio.wait(tasks)
        all_results = [r.result() for r in finished]  # 得到工作回报.
        print(all_results)
if __name__ == '__main__':
    t2 = time.time()
    loop = asyncio.get_event_loop()  # 创建一个事件循环对象loop
    try:
        loop.run_until_complete(main(loop))  # 完成事件循环,直到最后一个任务结束
    finally:
        loop.close()  # 结束事件循环.
    print("Async total time:", time.time() - t2)
async def job ( session ) : response = await session . get ( URL ) return str ( response . url ) async def main ( loop ) : async with aiohttp . ClientSession ( ) as session : tasks = [ loop . create_task ( job ( session ) ) for _ in range ( 5 ) ] finished , unfinished = await asyncio . wait ( tasks ) all_results = [ r . result ( ) for r in finished ] # 得到工作回报 . print ( all_results ) if __name__ == '__main__' : t2 = time . time ( ) # loop = asyncio . get_event_loop ( ) # Removed selector = selectors . SelectSelector ( ) # New line loop = asyncio . SelectorEventLoop ( selector ) # New line try : loop . run_until_complete ( main ( loop ) ) # 完成事件循环,直到最后一个任务结束 finally : loop . close ( ) # 结束事件循环 . print ( "Async total time:" , time . time ( ) - t2 )

一般来说这结果都是True, 也就是说 loop 是结束的

loop.run_until_complete(main(loop))

loop.run_until_complete 一开始就发现 loop closed, raise RuntimeError(‘Event loop is closed’)

什么都没作, 马上结束返回.

# loop = asyncio.get_event_loop()
loop = asyncio.new_event_loop()

修改如上, 就 OK 了 !

t2 = time.time()
loop = asyncio.new_event_loop()
#loop = asyncio.get_event_loop()  # 创建一个事件循环对象loop
try:
    loop.run_until_complete(main(loop))  # 完成事件循环,直到最后一个任务结束
finally:
    loop.close()  # 结束事件循环.
print("Async total time:", time.time() - t2)
async def job ( session ) : response = await session . get ( URL ) return str ( response . url ) async def main ( ) : loop = asyncio . get_running_loop ( ) async with aiohttp . ClientSession ( ) as session : tasks = [ loop . create_task ( job ( session ) ) for _ in range ( 5 ) ] finished , unfinished = await asyncio . wait ( tasks ) all_results = [ r . result ( ) for r in finished ] print ( all_results ) now = time . time ( ) asyncio . run ( main ( ) ) print ( "Async total time:" , time . time ( ) - now )

我原本是3.7.6, 改为3.8.2, 也出问题了, 一樣是
RuntimeError: Event loop is closed

你原本的代码除出错外, 有先出现那5个网址吗? 我跑你的原代码出错的是

>>> loop = asyncio.get_event_loop()
RuntimeError: There is no current event loop in thread 'MainThread'.

@Jason990420 非常感谢,为我排错还特意升级了版本,再次感谢,您所说的问题.

我用我自己的代码,会先出5个普通方法的返回,然后会出现一个列表就是携程后的结果,然后出现一大批RuntimeError: Event loop is closed

async def job ( session ) : response = await session . get ( URL ) return str ( response . url ) async def main ( loop ) : async with aiohttp . ClientSession ( ) as session : tasks = [ loop . create_task ( job ( session ) ) for _ in range ( 5 ) ] finished , unfinished = await asyncio . wait ( tasks ) all_results = [ r . result ( ) for r in finished ] # 得到工作回报 . print ( all_results ) if __name__ == '__main__' : t2 = time . time ( ) # loop = asyncio . get_event_loop ( ) # Removed selector = selectors . SelectSelector ( ) # New line loop = asyncio . SelectorEventLoop ( selector ) # New line try : loop . run_until_complete ( main ( loop ) ) # 完成事件循环,直到最后一个任务结束 finally : loop . close ( ) # 结束事件循环 . print ( "Async total time:" , time . time ( ) - t2 )

Platform Support

The asyncio module is designed to be portable, but some platforms have subtle differences and limitations due to the platforms’ underlying architecture and capabilities.

** Changed in version 3.8: On Windows, ProactorEventLoop is now the default event loop. **

All event loops on Windows do not support the following methods:

loop.create_unix_connection() and loop.create_unix_server() are not supported. The socket.AF_UNIX socket family is specific to Unix.

loop.add_signal_handler() and loop.remove_signal_handler() are not supported.

ProactorEventLoop has the following limitations:

The loop.add_reader() and loop.add_writer() methods are not supported.