- 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/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!