Python 如何异步运行同一类的多个实例?
我希望有许多代理连接到本地服务器的不同套接字,以便它们能够独立地读取和发送到服务器。到目前为止,我有:Python 如何异步运行同一类的多个实例?,python,asynchronous,python-asyncio,Python,Asynchronous,Python Asyncio,我希望有许多代理连接到本地服务器的不同套接字,以便它们能够独立地读取和发送到服务器。到目前为止,我有: 导入json 导入异步 类代理(): 定义初始化(自我、用户、pw): self.user=用户 self.pw=pw #存储主机和端口 self.host,self.port=“localhost”,12300 self.connect() 异步def连接(自): #创建异步套接字读写器 self.reader,self.writer=等待异步IO.open\u连接(self.host, 自
导入json
导入异步
类代理():
定义初始化(自我、用户、pw):
self.user=用户
self.pw=pw
#存储主机和端口
self.host,self.port=“localhost”,12300
self.connect()
异步def连接(自):
#创建异步套接字读写器
self.reader,self.writer=等待异步IO.open\u连接(self.host,
自助服务(端口)
请求=
#创建并发送身份验证请求
self.writer.write(请求)
等待self.writer.drain()
响应=等待self.reader.read(1000)
response=json.load(response.decode().split(“\0”)[0])
如果响应[“内容”][“结果”]=“确定”:
打印(“连接成功”)
其他:
打印(“连接失败”)
等待自我倾听
异步def接收消息(自身):
"""
等待来自服务器的消息并将其返回。
"""
msg=等待self.reader.readuntil(b“\0”)
msg=msg.decode().split(“\0”)[0]
#如果收到消息,将其解析到字典中。
如果len(msg)>1:
返回json.loads(msg)
其他:
打印(“重试接收邮件…”)
返回self.receive_msg()
异步def侦听(自):
"""
侦听服务器的输出,并在收到任何内容时写入
"""
尽管如此:
msg=等待自我。接收消息()
打印(“收到消息”,self.user)
列表=[]
loop=asyncio.get\u event\u loop()
对于范围(15)内的i:
a_list.append(Agent(f“agentA{i}”,“1”).connect())
循环。运行_直到_完成(asyncio.gather(*a_列表))
由于asyncio的工作方式,我认为这是异步运行的唯一方式。但是我希望能够以某种方式使\uu init\uu
异步运行,而不必在可能的情况下将connect
函数抛出到循环中。我基本上想做的是:
a_列表=[]
loop=asyncio.get\u event\u loop()
对于范围(15)内的i:
a_list.append(Agent(f“agentA{i}”,“1”))
循环。运行_直到_完成(asyncio.gather(*a_列表))
我认为这更有道理,但我不知道怎么做。我的想法是错误的,还是有更好的方法可以做到这一点?您不能使
\uuuu init\uuuuuu
异步,但您可以使代理
实例等待。为此,请定义\uuuu wait\uuuu
魔术方法:
class Agent:
def __init__(self, user, pw):
self.user = user
self.pw = pw
self.host, self.port = "localhost", 12300
def __await__(self):
yield from self.connect().__await__()
这两个方面都是最好的:你的
\uuuuu init\uuuu
函数保持同步,而代理
实例是像asyncio.gather()
这样的函数的有效参数,没有办法使\uuuu init\uuuu
异步,但是,如果你理解我的意思,我不想让连接函数成为代理的主干。如果这有意义的话,我想让整个代理“等待”。如果没有,那很好,我对异步编程非常陌生。@PEREZje您可以在\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。根据对象的状态,您可以有一些等待这个或那个的逻辑,等等。不管怎样,wait是一个及物动词,所以你必须等待一些东西,你不能只是一般地“让它可用”,而不在某处决定它在等待什么。我已经调查过了,你是对的,非常感谢你的帮助