我有一个程序,基本上有两个事件:
- EventOne:每分钟从REST API查询一次,得到一个
number
- EventTwo:在LED屏幕上显示来自EventOne的
number
困境在于:
- EventOne的REST API很慢,可能需要几秒钟才能加载
- EventTwo使用LED屏幕的驱动程序功能,它必须保持运行(也许只有毫秒级的间隔),以便LED屏幕刷新足够快,这意味着我不能让它阻塞几秒钟;否则LED显示断号。
我认为我需要的是一个异步HTTP I/O,就像JavaScript的async/await语法一样,这样我就可以在触发HTTP请求之后**“暂停”我的EventOne**,然后**取回数字并在其间运行我的EventTwo。当异步IO准备就绪时,可以恢复EventOne。
这是一个自然支持的东西吗?如果没有,是否有类似的事件循环框架原生支持此功能?
注意事项:
1.我目前的程序使用的是多线程模型,运行良好。这个问题的目的是调查使用事件循环来实现相同的可行性。
1条答案
按热度按时间goucqfw61#
我认为我需要的是一个异步HTTP I/O,就像JavaScript的async/await语法一样,这样我就可以在触发HTTP请求之后**“暂停”我的EventOne**,然后取回数字并在其间运行我的EventTwo。当异步IO准备就绪时,可以恢复EventOne。
你所描述的“事件”根本不是libevent这个术语的意思。你已经描述了你的程序可能采取的行动,但是事件是程序正常流程之外的东西,你的程序(可能)* 响应 *。
您已经根据频率描述了程序操作,因此程序可能感兴趣的一些事件可能是计时器触发。我想你会有一个快速计时器和一个慢速计时器。当快速计时器触发**(这是一个事件)时,您的程序运行驱动程序函数以刷新屏幕,并(如果需要)重置计时器。当慢速计时器触发(这是一个不同的事件)时,您的程序 * 发送 * REST请求。
但至少还有一个你感兴趣的事件:REST响应到达,或者至少是你期望它可读的套接字。然后,也只有在那时,您才能从套接字读取可用数据并对其进行处理。
这基本上就是I/O多路复用的工作方式。当且仅当客户端/设备准备就绪时,您才能为它们提供服务,通常使用
read()
和write()
等接口,只要它们能够取得一些进展,就不会阻塞,并跟踪每个客户端的位置。通过避免尝试读取或写入未就绪的设备,当有任何工作可以执行时,进程将不会在I/O上阻塞。这是一个自然支持的东西吗?
是的,这是libevent设计的主要目的。特别是I/O多路复用,尽管我的理解是它还集成了对计时器事件的处理。