本地机器和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上
Python - AWS Lambda 和 exchangeelib 的多处理问题
AWS IMDS 在特殊链接本地 IP 169.254.169.254 上运行 - IMDS 是不是在同一台 EC2 机器上运行,查询哪些信息?