我正在尝试实现一个接收器 Package 器,它将刷新委托给另一个任务。基本上:
- Package 器在构造时生成服务任务
- 循环中的服务任务在基础流上运行
flush()
,如果poll_flush()
返回Ready
,则暂停 - 当客户端将数据发送到 Package 的接收器中时,它将数据
feed()
发送到底层接收器,然后调用inner.poll_flush()
,该inner.poll_flush()
具有用于服务任务的上下文保持唤醒器。
想法应该是非常清楚的--客户端不需要费心冲洗Flume,但只要底层套接字/任何东西准备好,Flume就会自动冲洗。
(to避免处理多线程问题(假设所有这些都发生在同一个LocalSet
中)
我不知道如何为服务任务构建前面提到的Waker
--在时雄中是否可能?如果不可能--是否可能要求运行时使用它的句柄唤醒另一个任务?
2条答案
按热度按时间pgpifvop1#
我想不出如何为服务任务构建上述
Waker
当您不是执行者(* 拥有要轮询的任务 * 的“顶级”非异步代码)时,您永远不会 * 构造 *
Waker
-您只使用已经存在的Waker
。在此方案中,服务任务必须
await
您提供的某个future,并且在轮询该future时,其poll()
方法将被赋予Waker
。该唤醒程序是您需要唤醒以恢复服务任务的唤醒程序。如果尚未轮询该服务任务,则您将没有唤醒程序。但您也不需要它(因为任务 * 将 * 被轮询)。在某些情况下,这个问题可以通过使用异步通道(比如
tokio::sync
模块中的通道)来简化,而不是为服务任务获取唤醒器。我不确定您的情况是否属于这些情况之一--可能不是,因为您实际上希望将唤醒器传递给poll_flush()
,但也许有一种方法可以重新设计它,使其成为这种情况。pcww981p2#
我想通了:
因此,如果要将
poll_flush
唤醒委派给另一个任务(即等待LocalNotify
的任务),您可以:(当然,该任务应该在
select!
中循环运行inner.flush()
。您必须使用poll_fn()
和RefCell
,以便在相关的poll
调用期间暂时借用&mut
)