我有一个现有的应用程序,它广泛使用 libev 的事件循环。我现在想添加 OPC UA 服务器功能,但不确定如何最好地将 open62541 事件循环集成到 libev 中。
想到以下可能性:
UA_Server_run_iterate
从时间为 0 的 libev 事件循环中调用。waitInternal
这意味着服务器永远不会休眠(在 中轮询 open62541ev_idle
),或者来自 OPC UA 客户端的请求将经历高达 50 毫秒的额外延迟(默认open62541 的最大等待时间)。- 修补 open62541 以允许服务器网络层检索当前正在使用的文件描述符(serverSockets 和连接)。这将允许为这些文件描述符添加 libev 事件,而这些事件又可以
UA_Server_run_iterate
仅在必要时轮询。 - 实现一个使用 libev 的自定义服务器网络层。这似乎意味着相当多的代码重复......是否有任何示例/教程用于实现自定义网络层?
- 在单独的线程中运行 open62541 事件循环。我真的真的很想避免这种情况,因为像 libev 这样的事件系统的全部目的是避免与异步操作相关的问题。例如,来自 open62541 的所有回调都必须与主 libev 线程同步。
就复杂性和性能而言,您认为上述哪个选项“最好”?
您能想到上面未列出的任何其他选项吗?