Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 允许多个进程连接到单个进程并调用方法调用或访问资源_Multithreading_Python 2.7_Multiprocessing_Ipc - Fatal编程技术网

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

Multithreading 允许多个进程连接到单个进程并调用方法调用或访问资源,multithreading,python-2.7,multiprocessing,ipc,Multithreading,Python 2.7,Multiprocessing,Ipc,情景: 我目前有一个类MyLoadBalancerSingleton,它管理对资源集群的访问(resource1和resource2)。该类具有create(count)和delete(count)方法。当调用这些方法时,负载平衡器将对请求进行排队,然后对资源进行FIFO处理 当然,应该只有一个负载平衡器在运行,否则每个负载平衡器都会认为自己完全可以控制所管理的资源 问题是: 多个用户将同时尝试从GUI访问负载平衡器。每个用户将通过pythongui.py在同一台机器上生成自己的GUI。(它们都

情景:

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

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

问题是:

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

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

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

我怀疑Singleton不是正确的词,因为Singleton只在一个进程中工作。也许将负载平衡器作为守护进程运行,然后让那些GUI进程连接到它?我尝试搜索IPC,但它只会引导我找到
多处理
模块,这不是我想要的。
分布式集群计算模块(dispy)
也不是我想要的。这是在同一台机器上相互通信(IPC?)的严格过程

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

虚构的伪代码:

负载均衡器

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,在您的例子中)连接到单个服务器(您的singleton,是的,通常作为守护进程运行)。以下是其中一些:

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

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

回答得很好。它提供了每个选项的概述和功能。非常感谢。没问题,祝你的项目好运!另外,欢迎来到StackOverflow!一个快速提示:如果你认为一个答案是好的(值得认可,即使它不是最好的答案),你可以点击它旁边的向上箭头来增加它的可见性。通常我也会提到“接受这个答案”复选标记,但你已经打到了那个。