在Python和冗长的Rust模块之间双向发送数据?

mspsb9vt  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(95)

使用PyO 3将Rust模块集成到调用Python应用程序中的轻松性令人惊讶。
但接下来我想了解的是,是否有可能在可能长时间运行的Rust模块和Python代码之间交换数据。一个典型的情况是Python处理GUI(例如,PyQt),用户可能希望中途终止这个长时间运行的Rust模块。因此,希望Rust模块可以检测到优雅的中断机制。“优雅”往往意味着不使用SIGINT,我假设......
但Rust也需要能够向另一个方向发出信号:一种典型的情况是在GUI中更新进度指示器。但在另一种情况下,实际的重要对象可能需要从Rust代码中“剥离”出来,并被Python代码“捕获”。
这一切有可能吗我能想到一个难以置信的笨重的机制:如果Python代码想要中断,它会在磁盘上创建一个特定的文件。冗长的Rust代码会不断检查这样的文件是否存在,以及指令是什么。这种文件机制也可以用于在另一个方向上流动的数据。
但我希望有比这更好的方法。我做了一些搜索,但没有发现任何明显的东西。一个有趣的评论说:“也许使用crossbeam-channel来允许Python和Rust之间的通信,使Python能够向Rust程序发送信号/命令?“我看了一下交叉光束通道,但没有看到任何解决这种情况的东西。
当然,我也看了PyO 3。在各个线程/进程之间似乎没有任何关于通信的内容(注意,我还不清楚被调用的Rust模块是否实际上运行在与调用Python不同的 * 进程 * 中,但我假设是这样)。

  • 以后 *

事实上,根据我的实验,事实证明,除非你另外安排事情,例如。通过使用Python subprocessmultiprocessing等,实际上使用maturin develop编译的Rust to Python模块与调用Python代码在同一进程中运行**。
这对于这个问题的意义在于,它可能潜在地使用内部线程通信。zeromq使用套接字,似乎对我来说足够了(它显然是一种线程间通信的形式),我不知道这种“上级”的进程内线程间通信如何工作。也许一个合适的Maven会有一个想法。
当你在一个线程中运行一个PyO 3(马图林)模块,而在同一进程的另一个线程中运行一些Python代码时,想知道GIL如何适应这一点也很有趣。

pobjuy32

pobjuy321#

看了很多不同的可能性。
最好的解决方案似乎是解释here,选项3,zeromq.
设法在几分钟内获得Python和Rust之间的简单消息(在W10上)。
我有一个总的印象,套接字比管道慢。在各种可能的解决方案中挣扎,有些只是为了 *nix。如果有人能找到并给予一个Windows 10**的管道解决方案(“命名管道”)**的例子,那就太好了。

两个重要的警告

  1. PyO 3似乎与zmq不兼容。当我在Cargo.toml中包含后一个依赖项并运行maturin develop时,这失败了。但我没有检查这肯定是原因:可能是另一种依赖性是问题所在。因此,我把我的zmq功能放在另一个本地crate中(从支持PyO 3的crate中执行use没有问题)。
    1.当从Python运行任何PyO 3 Rust模块时(在同一进程中),似乎有必要释放GIL:否则Python代码中的Python线程将冻结!请参见this question

相关问题