- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 Electron 为给定的 Python 代码构建一个 GUI。数据流实际上很简单:用户与 Electron 应用交互,后者向 Python API 发送请求,Python API 处理请求并发送回复。
到目前为止,还不错。我阅读了不同的主题和博客文章:
但是在所有这三个解决方案中,我都在同一点上挣扎:我必须发出异步请求/回复,因为请求处理可能需要一些时间,而在这段时间内,可能已经出现了更多请求。对我来说,这看起来是一种非常常见的模式,但我在 SO 上没有找到任何东西,也许我只是不知道我到底在寻找什么。
Frontend Backend
| |
REQ1 |—————————————————————————————>|Process REQ1——--
| | |
REQ2 |—————————————————————————————>|Process REQ2 --|----—
| | | |
REP1 |<————————————————————————————-|REPLY1 <——————— |
| | |
REP2 |<————————————————————————————-|REPLY2 <———————————--
| |
在我看来,最灵活的解决方案是 3.zeroMQ,但在 website 上和 Python doc ,我只找到了最小的工作示例,其中发送和接收都是阻塞的。
有人可以给我提示吗?
最佳答案
如果您正在考虑使用 ZeroMQ,那么您正在进入 Actor 模型编程的世界。在 Actor 模型编程中,发送消息独立于接收消息(这两个事件是异步的)。
ZeroMQ 的阻塞意味着什么
当 ZeroMQ 谈到发送“阻塞”时,这意味着 ZeroMQ 用于在传输之前对消息进行排队的内部缓冲区已满,因此它会阻塞发送应用程序,直到该队列中有可用空间。清空队列的事情是将较早的消息成功传输到接收方,该接收方具有接收缓冲区,必须由接收应用程序清空。实际传输消息的是属于 ZeroMQ contenxt 的管理线程。
这个管理线程是关键部分;它独立于您自己的应用程序线程运行,因此它使发送方和接收方之间的通信异步。
您可能想要使用 ZeroMQ 的 react 器 zmq_poll()。通常在 actor 模型编程中你有一个循环,在顶部是对 react 器的调用(在这种情况下为 zmq_poll())。 Zmq_poll() 告诉您什么时候发生了什么,但是在这里您主要对它感兴趣,告诉您消息已经到达。通常,然后您会读取该消息,对其进行处理(这可能涉及发送其他 ZeroMQ 消息),然后循环回到 zmq_poll()。
后端
所以你的后端会是这样的:
while (forever)
{
zmq_poll(list of input sockets) // allows serving more than one socket
zmq_recv(socket that has a message ready to read) // will always succeed immediately because zmq_poll() told us there was a message waiting
decode req message
generate reply message
zmq_send(reply to original requester) // Socket should be in blocking mode to ensue that messages don't get lost if something is unexpectedly running slowly
}
如果不想服务多个前端,更简单:
while (forever)
{
zmq_recv(req) // Socket should be in blocking mode
decode req message
generate reply message
zmq_send(reply) // Socket should also be in blocking mode to ensure that messages don't get lost if something is unexpectedly running slow
}
前端
您的前端会有所不同。基本上,您需要 Electron 事件循环处理程序来接管 zmq_poll() 的角色。在 Electron 中使用的 ZeroMQ 构建将解决这个问题。但基本上它会归结为发送 ZeroMQ 消息的 GUI 事件回调。当消息从后端到达套接字时,您还必须编写一个回调,以便 Electron 运行。前端在发送和接收消息之间不会有任何阻塞。
时间
这说明你画的时序图是错误的。前端可以根据需要发送任意数量的请求,但是这些请求离开和到达后端之间没有时间对齐(尽管假设一切运行顺利,第一个请求几乎会立即到达)。发送一个或多个请求后,前端简单地返回做它想做的事(对于用户界面,这通常只是等待事件的事件循环管理器)。
该后端将处于读取/处理/回复、读取/处理/回复的循环中,一次处理一个请求。同样,那些离开和随后到达前端的回复之间没有时间对齐。当回复确实返回前端时,它会醒来并处理它。
关于python - Node.js/Electron 和 Python 之间的异步 IPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62182308/
我的主要流程(重要代码): let introWindow let win = null function createWindow() { // Create the browser win
信号量是一种 IPC 机制吗? 最佳答案 是的,在许多平台下,信号量可以跨进程同步。您将为此使用“命名”信号量——多个进程通过名称访问对象,类似于文件系统对象。 在 POSIX 中,您可以通过 sem
我一直在关注 Thrift 对 Windows 和 VS 开发的支持,感谢许多贡献者,它已经取得了长足的进步。有针对编译器和 C++ 库的 VS 2010 项目,我已经确认它们在 0.8 中运行良好。
或者它们是同义词吗? 最佳答案 维基百科通常非常适合这些目的。 RPC: Remote procedure call (RPC) is an Inter-process communication t
是否有标准库的一部分? 我一直在四处挖掘,但我看不到任何明显的实现它的东西,或者在 Process 上的任何东西可以让你这样做? 我错过了吗?还是我必须为此功能做一些 C 包装器工作? (如果是这样,
我计划在同一主机上运行的两个进程之间为我的 IPC(进程间通信)使用 unix 域套接字。但在选择 unix 套接字之前,我还必须研究数据安全性。 我只是想知道如果我使用 unix 套接字而不加密我在
System V IPC 和 POSIX IPC 之间有什么区别? 为什么我们有两个标准? 如何决定使用哪些 IPC 函数? 最佳答案 两者都有相同的基本工具——信号量、共享内存和消息队列。它们提供的
在我的menu.js中的“label:'Database'”下,单击事件返回错误:ipc未定义。我想,如果这是 main.js 文件的一部分,并且如果我已经在全局范围内声明了一个 const 为 ip
我正在设置两个 docker 容器 - 一个作为服务器在内存中保存数据,另一个作为客户端访问该数据。为此,我相信我需要使用 --ipc在容器之间共享内存的标志。 Docker documentatio
我正在尝试使用来自 HDFS 的文件运行 flink 作业。我创建了一个数据集如下 - DataSource> visits = env.readHadoopFile(new TextInputFor
我在 NetBeans IDE 8.0.2 中使用 hadoop 2.7.0 和 java oracle jdk1.7.0_79。当我尝试使用 Java 文件与 Hadoop 通信时,出现以下错误。是
我一直在使用 Electrons 同步和异步 RPC 通信机制,并且可以很好地在进程之间传递我的数据。但是,我现在需要不断地向渲染器进程发送事件数据(有点像聊天应用程序)并更新一些文本。 这在 Ele
我正在用 Go 编写一个负载平衡的服务器系统。 负载平衡服务器将与多个应用服务器通信并处理请求。这些服务器既可以在同一台机器上运行,也可以在网络上运行。 我已经弄清楚了网络,但现在我需要为负载均衡器找
我有一个关于操作系统中进程间通信的问题。 两个进程是否可以通过打开同一个文件(据说是在两个进程之前创建的,所以两个进程都有文件处理程序)然后通过写入该文件进行通信来相互通信? 如果是,这个方法属于什么
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 6年前关闭。
我有一个使用 System V 共享内存段的应用程序。通常它在内部管理这些,没有人需要接触它们。但对于紧急情况,我们有一个实用程序可以手动清除共享内存段。 问题是,为了做到这一点,它运行ipcs,并使
当使用node-ipc通过IPC在NodeJS进程之间进行通信时,启动服务器并监听连接,或者创建客户端并连接到服务器似乎非常简单。 但是有些事情看起来并不那么简单: How can the serve
我正在寻找有关我可以在我自制的 AVR32 板操作系统中实现的可能 IPC 机制的建议。 我目前的选择是实现 Tanenbaum 所写书籍中描述的按摩传递机制。 这是一个不错的选择吗?有没有更简单的方
我去面试了。面试官问我: If two nodes are sending two messages of the same identifier (0x100) with different dat
我正在寻找一种进程间通信工具,可以在相同或不同系统上运行的语言和/或环境之间使用。例如,它应该允许在 Java、C# 和/或 C++ 组件之间发送信号,并且还应该支持某种排队机制。唯一明显与环境和语言
我是一名优秀的程序员,十分优秀!