异步:同步的事件与未来

2024-06-16 11:20:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在浏览一些asyncio网络和实现的源代码,这在我的脑海中提出了一个问题。在

为了在等待数据从套接字到达时创建非阻塞I/O,其末尾的asyncio.StreamReader.read()调用_wait_for_data方法,该方法creates an empty ^{}并等待它。在

^{}方法中,当新数据到达流(^{cd6>}方法)时,该方法被称为,该方法称为。在

这完全有道理。在

我的问题是:

为什么不使用^{}在我看来,活动就是为了这些目的而设计的。实际上,您不必为每个_wait_for_data调用创建一个新的Future,而是初始化一个类中的单个事件,并在其生存期内简单地切换其值。它还具有特定的.wait()方法,用于等待其值变为真(当新数据从套接字到达时)。在

有人能详细说明这两种方法之间是否有实际的区别吗?或者只是一种随意选择的方法?在


Tags: 数据方法网络anasyncioforreaddata
2条回答

未来是低级原始的。 它功能强大,但用户代码通常不需要它。 就像Linux有futex,但是用户代码使用高级对象,比如锁和递归锁。在

虽然通常您可以将Future替换为Event,如果您不关心将来将填充的数据,我认为在这种情况下是不正确的。在

在代码中,self._waiter不仅用于指示唤醒事件,还用于指示发生的indicate exceptionset_exception到{}意味着这个异常将在等待未来的代码中引发:

# 

waiter.set_exception(exc)  # Exception set here...

# 

self._waiter = self._loop.create_future()
try:
    yield from self._waiter  # ... will be raised here and propagated to outer code
finally:
    self._waiter = None

如果将self._waiter更改为Event,则无法实现此目标。在

相关问题 更多 >