我有一段简单的异步代码,它会生成
注意它需要一个自定义的循环。如果我使用以下内容运行它:
它按预期工作(在3秒钟的
我遇到了一个
我能让自定义事件循环工作的唯一方法是在创建自己的
这里怎么回事?我是否误解了文档?必须将所有事件循环(您使用的)都设置为默认值吗?如果是这样,那么允许传递自定义循环给许多异步方法(例如 create_subprocess_exec 和 wait_for)似乎毫无意义,因为您可以传递的唯一值是 get_event_loop(),它就是默认值。
sleep 3
并等待它完成:from asyncio import SelectorEventLoop, create_subprocess_exec, \
wait_for, get_event_loop, set_event_loop
def run_timeout(loop, awaitable, timeout):
timed_awaitable = wait_for(awaitable, timeout=timeout, loop=loop)
return loop.run_until_complete(timed_awaitable)
async def foo(loop):
process = await create_subprocess_exec('sleep', '3', loop=loop)
await process.wait()
print(process.returncode)
注意它需要一个自定义的循环。如果我使用以下内容运行它:
loop = get_event_loop()
run_timeout(loop, foo(loop), 5)
loop.close()
它按预期工作(在3秒钟的
sleep 3
成功完成并打印0
)。但是,如果我使用自己的事件循环运行它:loop = SelectorEventLoop()
run_timeout(loop, foo(loop), 5)
loop.close()
我遇到了一个
TimeoutError
错误(来自于run_timeout
中的wait_for
)。Traceback (most recent call last):
File "test.py", line 15, in <module>
_run_async(loop, foo(loop), 5)
File "test.py", line 7, in _run_async
return loop.run_until_complete(timed_coroutine)
File "/usr/lib/python3.5/asyncio/base_events.py", line 387, in run_until_complete
return future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step
result = coro.send(None)
File "/usr/lib/python3.5/asyncio/tasks.py", line 396, in wait_for
raise futures.TimeoutError()
concurrent.futures._base.TimeoutError
我能让自定义事件循环工作的唯一方法是在创建自己的
SelectorEventLoop
之后调用set_event_loop()
:loop = SelectorEventLoop()
set_event_loop(loop)
run_timeout(loop, foo(loop), 3)
loop.close()
这里怎么回事?我是否误解了文档?必须将所有事件循环(您使用的)都设置为默认值吗?如果是这样,那么允许传递自定义循环给许多异步方法(例如 create_subprocess_exec 和 wait_for)似乎毫无意义,因为您可以传递的唯一值是 get_event_loop(),它就是默认值。
asyncio.subprocess
中的一个错误。在Python 3.6下运行代码会报告a different exception。 - user4815162342run_timeout()
之前执行set_event_loop()
是否可以抑制3.6的错误? - Bailey Parkersleep 3
完成(因为子进程需要一些时间来设置)而出现超时吗? - user4815162342