本地机器和 AWS 之间的多处理?

Multiprocessing between local machine and AWS?

我开发了 3 个脚本(一个服务器、一个编写器和一个 Reader),它们使用来自 multiprocessing.managers 的 BaseManager 协同工作。所有这些 运行 在 AWS 或本地都很好。但现在我想把事情搞混。对于更复杂的脚本,使用 GPU,我想使用我的本地机器,并且仍然 运行 它脱离 AWS...

如何连接到 "the Server",谁创建了 IPC、队列等,运行ning 在 AWS 上?

(编辑:我找到了答案,请看下面,我删除了我之前留在此处的技术细节,并为那些有同样问题的人创建了一个更通用的问答)

请查看以下 3 个实体的代码:

服务器:

from multiprocessing.managers import BaseManager
from queue import Queue

class Server():
    def __init__(self, ip, port, authkey):
        super(Server, self).__init__()
        self.ip = ip
        self.port = port
        self.authkey = authkey

    def make_server_manager(self):
        """ Create a manager for the server, listening on the given port.
            Return a manager object with all the required queues.
        """
        q = Queue()  # input queue
        BaseManager.register('q', callable=lambda: q)
        manager = BaseManager(address=(self.ip, self.port), authkey=self.authkey)
        print('Server started at port ' + str(self.port))
        return manager


if __name__ == "__main__":
    ip = '172.31.2.45'
    port = 11111
    authkey = 'abc'.encode('utf-8')

    s = Server(ip, port, authkey)
    mgr = s.make_server_manager()
    s = mgr.get_server()
    s.serve_forever()

The Writer(在 AWS 上 运行ning,尽管如果我需要它也可以 运行 在我的本地机器上):

from multiprocessing.managers import BaseManager

class Client():

    def __init__(self, ip, port, authkey):
        super(Client, self).__init__()
        self.ip = ip
        self.port = port
        self.authkey = authkey

        # Create the queus and variables
        BaseManager.register('q')
        m = BaseManager(address=(ip, port), authkey=authkey)
        m.connect()
        self.q = m.q()

if __name__ == "__main__":
    ip = '172.31.2.45'
    port = 11111
    authkey = 'abc'.encode('utf-8')

    Client = Client(ip, port, authkey)

    while True:
        X = input('What is your secret message?')
        Client.q.put(X)
        if X == 'Close':
            break

reader(运行 在我的本地机器上用于本练习)

from multiprocessing.managers import BaseManager

class Client():

    def __init__(self, ip, port, authkey):
        super(Client, self).__init__()
        self.ip = ip
        self.port = port
        self.authkey = authkey

        # Create the queus and variables
        BaseManager.register('q')
        m = BaseManager(address=(ip, port), authkey=authkey)
        print('connecting...')
        m.connect()
        print('connected')
        self.q = m.q()

if __name__ == "__main__":
    ip = '18.191.25.217'
    port = 11111
    authkey = 'abc'.encode('utf-8')

    Client = Client(ip, port, authkey)

    while True:
        rcvd = Client.q.get()
        print(rcvd)
        if rcvd == 'Close':
            break

(我自己找到了答案,所以决定稍微修改一下我的问题,并确保我突出了答案中的重要部分。)

为了使其正常工作,请务必在 AWS 上的安全组和脚本中正确设置 IP 地址。

我在这里给出的答案假设 Server 运行 在 AWS 上,其他脚本可以是 运行 本地或 AWS。

您需要进行以下设置:
在您的 AWS 安全组中创建具有以下规范的自定义 TCP 规则:
1. IP地址:您本机的IP地址
2. 端口范围:您服务器 运行 所在的端口(范围/编号),在本例中为 11111

您的脚本必须包含以下 IP 地址:
- 服务器(AWS 上的 运行ning):实例在 AWS 上的私有 IP
- 不在 AWS 上 运行ning 的进程(Reader / Writer / 无论你选择 运行 在你的本地机器上):服务器实例的 public IPv4 地址运行宁

您脚本中的端口号和验证码显然必须全部匹配。

希望一切都清楚。祝大家开心。