允许多个进程连接到单个进程并调用方法调用或访问资源



场景:

我目前有一个类MyLoadBalancerSingleton,它管理对资源集群的访问(resource1resource2(。该类具有create(count(delete(count(方法。当调用这些方法时,负载均衡器会将请求排队,然后在资源上进行FIFO处理。

当然,应该只有一个负载均衡器在运行,否则每个负载均衡器都会认为自己完全控制了所管理的资源。

问题是:

多个用户将同时尝试从GUI访问负载平衡器。每个用户将通过python gui.py在同一台机器上生成自己的GUI。(它们将全部ssh到同一台机器中(因此,每个GUI都将在自己的进程中运行。然后GUI将尝试与负载平衡器进行通信。

是否可以让这些多个GUI进程只访问一个负载平衡器进程并调用负载平衡器的方法?

我查看了multiprocessing库,发现工作流程与我想要的相反。使用我的示例,它将是:负载平衡器进程生成2个GUI进程(子进程(,然后与子进程共享父资源。在我的示例中,GUI和负载均衡器都是顶级进程。(无父子关系(

我怀疑"单身汉"这个词不合适,因为单身汉只在一个过程中工作。也许将负载均衡器作为守护进程运行,然后让这些GUI进程连接到它?我试着搜索IPC,但它只是把我带到了multiprocessing模块,这不是我想要的。distributed, cluster computing modules (dispy)也不是我想要的。这是在同一台机器上相互通信(IPC?(的严格过程。

这就引出了我最初的问题:是否可以允许多个进程连接到单个进程并调用方法调用或访问其资源?所有进程都将在同一台机器上执行

虚拟伪代码:

LoadBalancer.py

class MyLoadBalancerSingleton(object):
    def __init__():
        # Singleton instance logic here
        # Resource logic here
    def create(count):
        resource1.create(count)
        resource2.create(count)
    def delete(count):
        resource1.delete(count)
        resource2.delete(count)

Guid.py

class GUI(object):
    def event_loop():
        # count = Ask for user input
        # process = Locate load balancer process
        # process.create(count)
        # process.delete(count)

感谢您抽出时间!

是的,这是可能的。我手头没有一个特定于Python的例子,但你可以做到。有几种IPC允许多个客户端(在你的情况下是GUI(连接到一个服务器(你的singleton,是的,通常会作为守护进程运行(。以下是其中的一些:

  • 跨平台:TCP套接字。您需要服务器允许在单个侦听套接字上进行多个连接,并在客户端连接(和断开连接(时处理这些连接。跨多台机器使用最简单的方法,但也是最不安全的选项(无ACL等(
  • Windows特定:命名管道。Windows的命名管道不同于POSIX操作系统的类似但功能差得多的功能,它可以允许多个客户端同时连接。您需要创建一个多实例管道服务器。MSDN有很好的例子。我不确定在Python中最好的方法是什么,但我知道ActivePython有NT命名管道API的包装器。客户端只需要能够打开一个文件(格式为\.pipeLoadBalancer(。文件API用于读取和写入管道
  • 仅限POSIX(Linux、BSD、OS X等(:Unix域套接字。POSIX相当于NT的命名管道,它们使用套接字API,但端点在文件系统(如/var/LoadBalanceSocket(上,而不是在IP地址/协议/端口元组上
  • 其他各种东西,使用共享内存/内存映射文件、RPC、COM(在Windows上(、Grand Central Dispatch(OS X(、D-Bus(跨平台但第三方(等。除了GCD之外,它们都不适合您在这里谈论的简单情况

当然,这些方法中的每一种都需要服务器处理多个同时连接的客户端。服务器需要在它们之间进行同步,并避免一个客户端阻止其他客户端获得服务。您可以使用多线程来实现快速响应和在等待时最小化CPU成本,或者轮询一个快速而肮脏的解决方案来避免多线程同步(互斥锁等(。

最新更新