【发布时间】:2023-02-14 06:17:54
【问题描述】:
(我为我的英语道歉,我是法国人^^')
我用 Asyncio 方法声明,我有一个小问题。 我有 3 个 python 文件,main.py、commands.py 和 Client.py(所有名称仅供示例),我尝试同时运行多个任务,在 commands.py 中认为我的 main.py。但是每个任务都等待前一个任务开始。
在 Client.py 中(但不关心,我简化了这个,它只是为了上下文)
class StartClient(threading.Thread):
def __init__(self, port = 0):
threading.Thread.__init__(self)
self.setDaemon(True)
self.port = port
def get_name(self) :
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect(("localhost", self.port))
self.client_socket.setblocking(0)
self.client_socket.sendall("get_name")
reply = self.client_socket.recv(4098)
print (f"reply from {self.port}: ", reply)
return reply
在 Commands.py 中
async def client_get_name(port):
print (f"start_client {port}")
client = StartClient(port)
name = client.get_name()
return name
async def run_mutl_clients():
tasks = {}
ports = [61,65,67]
for port in ports:
tasks[str(port)]= asyncio.create_task(client_get_name(port))
for port, task in tasks.items() :
scene_name = await task
opened_instances[str(port)] = scene_name
MyPySideDialog.launch(opened_instances)
在我的 main.py
class FabulousPySideApp():
def __init__(self):
self.run_async()
def run_async(self):
asyncio.run(Commands.run_mutl_clients())
所以,我希望同时启动多个client_get_name()(一个通过端口),并等待它们完成发送opened_instances到MyPySideDialog(这只是用户的用户界面,不关心那个)。
StartClient() 是启动套接字客户端的函数(按类型,按端口)。如果我有很多端口要一一打开,这就有点太长了。我想同时启动所有端口,等待他们的回答。
预期的 :
>>start_client 61
>>start_client 65
>>start_client 67
>>reply from 61, "name1"
>>reply from 65, "name2"
>>reply from 67, "name3"
[Finished in 2s]
现实 :
>>start_client 61
>>reply from 61, "name1"
>>start_client 65
>>reply from 65, "name2"
>>start_client 67
>>reply from 67, "name3
[Finished in 6s]
"
我想,我错过了一些东西...... 有人可以帮助我 :)
谢谢
【问题讨论】:
-
什么是
Commands、MyPySideDialog和StartClient?另外,请修复您的缩进。理想情况下,提供一个示例,让这里的人可以运行以查看您遇到的问题,并请描述发生了什么以及您期望发生什么。问题是您的任务当前一个接一个地运行,您希望它们并行运行吗?asyncio本身并没有并行运行任何东西,它只是异步运行代码,这是不一样的——也就是说,如果有理由这样做,你的结果可能会以不同的顺序出现,但例程仍然会运行一次一个 -
感谢你的回复。我是一个复杂的“架构”,我最多尝试简化,对此感到抱歉。我会按照我的期望编辑我的消息。但是,我希望同时启动多个
client_get_name()(一个通过端口),并等待它们完成发送opened_instances到MyPySideDialog(这只是用户的用户界面,不关心那个)。StartClient()是启动套接字客户端的函数。如果我有很多端口要一一打开,这就有点太长了。我想同时启动所有端口,等待他们的回答。我希望它更详细。
标签: python asynchronous async-await python-asyncio