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

Posted

技术标签:

【中文标题】本地机器和AWS之间的多处理?【英文标题】:Multiprocessing between local machine and AWS? 【发布时间】:2019-02-04 14:28:16 【问题描述】:

我使用 multiprocessing.managers 的 BaseManager 开发了 3 个脚本(一个服务器、一个写入器和一个读取器)。所有这些都在 AWS 或本地运行良好。但现在我想把事情搞混。对于更复杂的脚本,使用 GPU,我想使用我的本地机器,并且仍然在 AWS 之外运行它......

如何连接到在 AWS 上运行的创建 IPC、队列等的“服务器”?

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

请查看以下 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()

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

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

阅读器(在我的本地机器上运行以完成本练习)

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

【问题讨论】:

【参考方案1】:

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

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

我这里给出的答案是假设服务器在AWS上运行,其他脚本既可以在本地运行,也可以在AWS上运行。

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

您的脚本必须包含以下 IP 地址: - 服务器(在 AWS 上运行):AWS 上实例的私有 IP - 未在 AWS 上运行的进程(读取器/写入器/您选择在本地计算机上运行的任何内容):运行服务器的实例的公共 IPv4 地址

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

希望很清楚。祝大家愉快。

【讨论】:

以上是关于本地机器和AWS之间的多处理?的主要内容,如果未能解决你的问题,请参考以下文章

从本地机器上的 ubuntu (AWS EC2) 读取文件?

Python 函数在 AWS Glue 中返回非类型,即使是在本地机器上工作的相同函数

validate_email python库在本地机器上工作,但不在aws弹性bean上

无法从我的本地 ubuntu 机器推送到 aws ec2

Python - AWS Lambda 和 exchangeelib 的多处理问题

AWS IMDS 在特殊链接本地 IP 169.254.169.254 上运行 - IMDS 是不是在同一台 EC2 机器上运行,查询哪些信息?