允许多个进程连接到一个单例进程并调用方法调用或访问资源
Allowing multiple processes to connect to a singleton process and invoke method calls or access resources
场景:
我目前有一个 class MyLoadBalancerSingleton
来管理对资源集群的访问(resource1
和 resource2
)。 class 有方法 create(count) 和 delete(count)。当调用这些方法时,负载均衡器会将请求排队,然后在资源上进行 FIFO 处理。
当然,应该只有一个负载均衡器 运行ning 否则每个人都会认为他们可以完全控制所管理的资源。
问题是:
多个用户将同时尝试从 GUI 访问负载平衡器。每个用户将在同一台机器上通过 python gui.py
生成自己的 GUI。 (它们都将通过 ssh 进入同一台机器)因此,每个 GUI 都将 运行 在它自己的进程中运行。然后 GUI 将尝试与负载平衡器通信。
是否可以让那些多个 GUI 进程只访问一个负载均衡器进程并调用负载均衡器的方法?
我查看了 multiprocessing
库,工作流程似乎与我想要的相反。使用我的示例,它将是:Loadbalancer 进程生成 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)
Gui.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)连接到单个服务器(您的单身人士,是的,通常是 运行 作为守护进程)。以下是其中的一些:
- 跨平台:TCP 套接字。您需要您的服务器允许在单个侦听套接字上进行多个连接,并在客户端连接(和断开连接)时处理它们。跨多台计算机使用的最简单方法,但也是最不安全的选项(无 ACL 等)。
- Windows-特定:命名管道。 Windows' 命名管道与 POSIX OSes 的类似名称但功能较弱的功能不同,它可以允许多个客户端同时连接。您需要创建一个多实例管道服务器。 MSDN 有很好的例子。我不确定在 Python 中最好的方法是什么,但我知道 ActivePython 有 NT 命名管道 API 的包装器。客户端只需要能够打开一个文件(格式为
\.\pipe\LoadBalancer
)。文件 API 用于读取和写入管道。
- POSIX-only(Linux、BSD、OS X 等):Unix 域套接字。 POSIX 相当于 NT 的命名管道,它们使用套接字 API,但端点在文件系统上(如
/var/LoadBalanceSocket
),而不是在 IP address/protocol/port 元组上。
- 各种其他东西,使用诸如共享内存/内存映射文件、RPC、COM(在 Windows)、Grand Central Dispatch(OS X)、D-Bus(跨-平台但第三方),等等。 None 其中,GCD 可能除外,非常适合您在这里谈论的简单情况。
当然,这些方法中的每一种都需要服务器处理多个同时连接的客户端。服务器将需要在它们之间进行同步,并避免一个客户端阻塞其他客户端的服务。您可以使用多线程来实现快速响应和等待时的最小 CPU 成本,或者轮询避免多线程同步(互斥锁等)的快速而肮脏的解决方案。
场景:
我目前有一个 class MyLoadBalancerSingleton
来管理对资源集群的访问(resource1
和 resource2
)。 class 有方法 create(count) 和 delete(count)。当调用这些方法时,负载均衡器会将请求排队,然后在资源上进行 FIFO 处理。
当然,应该只有一个负载均衡器 运行ning 否则每个人都会认为他们可以完全控制所管理的资源。
问题是:
多个用户将同时尝试从 GUI 访问负载平衡器。每个用户将在同一台机器上通过 python gui.py
生成自己的 GUI。 (它们都将通过 ssh 进入同一台机器)因此,每个 GUI 都将 运行 在它自己的进程中运行。然后 GUI 将尝试与负载平衡器通信。
是否可以让那些多个 GUI 进程只访问一个负载均衡器进程并调用负载均衡器的方法?
我查看了 multiprocessing
库,工作流程似乎与我想要的相反。使用我的示例,它将是:Loadbalancer 进程生成 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)
Gui.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)连接到单个服务器(您的单身人士,是的,通常是 运行 作为守护进程)。以下是其中的一些:
- 跨平台:TCP 套接字。您需要您的服务器允许在单个侦听套接字上进行多个连接,并在客户端连接(和断开连接)时处理它们。跨多台计算机使用的最简单方法,但也是最不安全的选项(无 ACL 等)。
- Windows-特定:命名管道。 Windows' 命名管道与 POSIX OSes 的类似名称但功能较弱的功能不同,它可以允许多个客户端同时连接。您需要创建一个多实例管道服务器。 MSDN 有很好的例子。我不确定在 Python 中最好的方法是什么,但我知道 ActivePython 有 NT 命名管道 API 的包装器。客户端只需要能够打开一个文件(格式为
\.\pipe\LoadBalancer
)。文件 API 用于读取和写入管道。 - POSIX-only(Linux、BSD、OS X 等):Unix 域套接字。 POSIX 相当于 NT 的命名管道,它们使用套接字 API,但端点在文件系统上(如
/var/LoadBalanceSocket
),而不是在 IP address/protocol/port 元组上。 - 各种其他东西,使用诸如共享内存/内存映射文件、RPC、COM(在 Windows)、Grand Central Dispatch(OS X)、D-Bus(跨-平台但第三方),等等。 None 其中,GCD 可能除外,非常适合您在这里谈论的简单情况。
当然,这些方法中的每一种都需要服务器处理多个同时连接的客户端。服务器将需要在它们之间进行同步,并避免一个客户端阻塞其他客户端的服务。您可以使用多线程来实现快速响应和等待时的最小 CPU 成本,或者轮询避免多线程同步(互斥锁等)的快速而肮脏的解决方案。