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是一个及物动词,所以你必须等待一些东西,你不能只是一般地“让它可用”,而不在某处决定它在等待什么。我已经调查过了,你是对的,非常感谢你的帮助