以下是代码一运行就报错:RuntimeError: Event loop is closed网上找了很多资料的解决方法也都不行,请问哪里的问题?谢谢大家
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()
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()
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.