【问题标题】:How to use ASYNCIO through multi python files?如何通过多个 python 文件使用 ASYNCIO?
【发布时间】: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_instancesMyPySideDialog(这只是用户的用户界面,不关心那个)。 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]
"

我想,我错过了一些东西...... 有人可以帮助我 :)

谢谢

【问题讨论】:

  • 什么是 CommandsMyPySideDialogStartClient?另外,请修复您的缩进。理想情况下,提供一个示例,让这里的人可以运行以查看您遇到的问题,并请描述发生了什么以及您期望发生什么。问题是您的任务当前一个接一个地运行,您希望它们并行运行吗? asyncio 本身并没有并行运行任何东西,它只是异步运行代码,这是不一样的——也就是说,如果有理由这样做,你的结果可能会以不同的顺序出现,但例程仍然会运行一次一个
  • 感谢你的回复。我是一个复杂的“架构”,我最多尝试简化,对此感到抱歉。我会按照我的期望编辑我的消息。但是,我希望同时启动多个client_get_name()(一个通过端口),并等待它们完成发送opened_instancesMyPySideDialog(这只是用户的用户界面,不关心那个)。 StartClient() 是启动套接字客户端的函数。如果我有很多端口要一一打开,这就有点太长了。我想同时启动所有端口,等待他们的回答。我希望它更详细。

标签: python asynchronous async-await python-asyncio


【解决方案1】:

你的问题在代码中:

for port, task in tasks.items() : 
    scene_name = await task
    opened_instances[str(port)] = scene_name

scene_name = await task行。该行的意思是:“停止此功能 (run_mutl_clients) 直到任务完成,同时运行其他功能”

要同时运行所有任务,您可以将代码重写为:

async def run_mutl_clients():
    
    ports = [61,65,67]
    tasks = [client_get_name(port) for port in ports]

    instances = await asyncio.gather(*tasks)

    opened_instances = {
        port: instance 
        for (port, instance) in zip(ports, instances)
    }

    MyPySideDialog.launch(opened_instances)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多