【问题标题】:How to communicate between two instances of python interpreter?python解释器的两个实例之间如何通信?
【发布时间】:2021-02-03 13:47:56
【问题描述】:

问题

两个python脚本需要相互通信。

……但是有一个小问题。一个是服务(用python编写),当用户的计算机启动(核心)时被调用,第二个在用户想要(前端)时被调用,也是用python和前端技术编写的。 所以我们至少有两个不同的python解释器实例。

我尝试了什么

使用文件 → 不安全,任何进程都可以读取内容。

使用 Socket → 防火墙问题,安全性不是很好。

使用管道 (os.pipe()) → 在不同的 python 解释器之间不共享。 (相同版本),更好的安全性(控制插件比控制系统上的每个进程更容易)

有没有其他我没有尝试过的方法或可能有帮助的建议,标准库函数或类,库或其他东西?

如果前端再次调用核心,大约需要 15 秒(请不要谈论这个)。我不会让我的用户等待 15 秒来启动核心。这将导致删除应用程序和一些不友好的词。 :)

也许有用

通信必须能够传输超过数千个字节。 如果它也兼容python2那就太好了。

马蒂诺回答后更新

解决方案

感谢martineauhis answer 让我可以编写关于解决方案的code-sn-p。代码sn-p:

>>> from multiprocessing import shared_memory
>>> s = shared_memory.SharedMemory("NAME", create=True)
>>> s.buf[0] = 5
>>> # Now in another python shell
>>> import multiprocessing.shared_memory as sm
>>> sm.SharedMemory("NAME", create=False)
>>> s.buf[0] 
5

【问题讨论】:

  • 感谢编辑@martineau 现在看起来更好了。但仍然没有答案):
  • 我不是进程间通信方面的专家。您可以尝试的一件事是multiprocessing.shared_memory。文档说“......一个进程可以创建一个具有特定名称的共享内存块,并且不同的进程可以使用相同的名称附加到同一个共享内存块。”
  • 随意将您的代码添加到我的答案中(或将其添加为此处允许的单独答案 - 您仍然可以接受我的答案)还有另一个可能是您 edit 您的问题和在它的末尾添加一个更新,显示你做了什么。
  • 我想将它添加到您的答案中。但stackoverflow不让我。所以我会将它添加到我的问题本身。带有您的答案的链接
  • 糟糕,忘记了这个限制。你的选择听起来不错。谢谢。

标签: python python-3.x python-2.7 security communication


【解决方案1】:

您可以尝试的一件事是multiprocessing.shared_memory。它的文档说“......一个进程可以创建一个具有特定名称的共享内存块,并且不同的进程可以使用相同的名称附加到同一个共享内存块。

详细说明:让服务创建一个共享内存实例并为其指定唯一名称,然后让前端在运行时查找具有该名称的实例(在调用时指定 create=False这样做)。

希望这对您来说清楚且足够详细。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2014-03-18
    • 2012-06-20
    • 1970-01-01
    • 2011-08-05
    相关资源
    最近更新 更多