首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么会导致asyncio.new_event_loop()的简单调用挂起?

什么会导致asyncio.new_event_loop()的简单调用挂起?
EN

Stack Overflow用户
提问于 2016-03-08 07:11:23
回答 1查看 2.2K关注 0票数 8

我使用以下函数强制协同器同步运行:

代码语言:javascript
复制
import asyncio
import inspect
import types
from asyncio import BaseEventLoop
from concurrent import futures


def await_sync(coro: types.CoroutineType, timeout_s: int=None):
    """

    :param coro: a coroutine or lambda loop: coroutine(loop)
    :param timeout_s:
    :return:
    """
    loop = asyncio.new_event_loop()  # type: BaseEventLoop
    if not is_awaitable(coro):
        coro = coro(loop)
    if timeout_s is None:
        fut = asyncio.ensure_future(coro, loop=loop)
    else:
        fut = asyncio.ensure_future(asyncio.wait_for(coro, timeout=timeout_s, loop=loop), loop=loop)
    loop.run_until_complete(fut)
    return fut.result()

def is_awaitable(coro_or_future):
    if isinstance(coro_or_future, futures.Future):
        return coro_or_future
    elif asyncio.coroutines.iscoroutine(coro_or_future):
        return True
    elif asyncio.compat.PY35 and inspect.isawaitable(coro_or_future):
        return True
    else:
        return False

但是,它会断断续续地冻结只需创建一个新循环:loop = asyncio.new_event_loop()。检查堆栈跟踪显示了它挂起的确切位置:

代码语言:javascript
复制
File: "/src\system\utils.py", line 34, in await_sync
  loop = asyncio.new_event_loop()  # type: BaseEventLoop
File: "\lib\asyncio\events.py", line 636, in new_event_loop
  return get_event_loop_policy().new_event_loop()
File: "\lib\asyncio\events.py", line 587, in new_event_loop
  return self._loop_factory()
File: "\lib\asyncio\selector_events.py", line 55, in __init__
  self._make_self_pipe()
File: "\lib\asyncio\selector_events.py", line 116, in _make_self_pipe
  self._ssock, self._csock = self._socketpair()
File: "\lib\asyncio\windows_events.py", line 295, in _socketpair
  return windows_utils.socketpair()
File: "\lib\socket.py", line 515, in socketpair
  ssock, _ = lsock.accept()
File: "\lib\socket.py", line 195, in accept
  fd, addr = self._accept()

在像socket这样低级别的库中,是什么导致了这样的问题呢?我做错了什么吗?我正在使用Python3.5.1。

编辑:,我提交了一个bug报告这里,但是Guido建议我继续在StackOverflow上寻求帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-22 23:02:14

我在试着理解你想做什么。

如果我正确地得到它,您希望一个函数返回相同的东西,无论输入是一个协同线还是一个简单的函数调用。如果我是对的,那么这似乎很好。

代码语言:javascript
复制
import asyncio
import time

def await_sync(coro, timeout=None):
  if asyncio.iscoroutine(coro):
    f = asyncio.wait_for(coro, timeout)
    loop = asyncio.get_event_loop()
    return loop.run_until_complete(f)
  return coro

async def async_test(x):
    print("x", end="")
    await asyncio.sleep(x)
    print("y", end="")
    return x

def sync_test(x):
    print("x", end="")
    time.sleep(x)
    print("y", end="")
    return x

print(await_sync(sync_test(2)))
print(await_sync(async_test(3)))

这将输出以下结果(我猜是预期的)结果:

代码语言:javascript
复制
xy2
xy3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35861175

复制
相关文章

相似问题

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