本地机器和 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 地址运行宁
您脚本中的端口号和验证码显然必须全部匹配。
希望一切都清楚。祝大家开心。
我开发了 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 地址运行宁
您脚本中的端口号和验证码显然必须全部匹配。
希望一切都清楚。祝大家开心。