我正在尝试在python中创建一个脚本,该脚本使用websockets和asyncio侦听多个套接字,问题是无论我做什么,它只能侦听我调用的第一个套接字。
我认为它是无限循环,我有什么解决方案?每个插座使用螺纹?

  async def start_socket(self, event):
    payload = json.dumps(event)
    loop = asyncio.get_event_loop()

    self.tasks.append(loop.create_task(
        self.subscribe(event)))

    # this should not block the rest of the code
    await asyncio.gather(*tasks)


  def test(self):
    # I want to be able to add corotines at a different time
    self.start_socket(event1)
    # some code
    self.start_socket(event2)

最佳答案

您的代码看起来不完整,但是显示的内容有两个问题。一个是run_until_complete接受协程对象(或其他类型的未来),而不是协程函数。因此应该是:

# note parentheses after your_async_function()
asyncio.get_event_loop().run_until_complete(your_async_function())



  问题是,无论我做什么,它都只侦听我调用的第一个套接字。我认为它是无限循环,我有什么解决方案?每个插座使用螺纹?


无限循环不是问题,asyncio旨在支持这种“无限循环”。问题是您试图在一个协程中执行所有操作,而您应该为每个websocket创建一个协程。这不是问题,因为协程非常轻巧。

例如(未测试):

async def subscribe_all(self, payload):
    loop = asyncio.get_event_loop()
    # create a task for each URL
    for url in url_list:
        tasks.append(loop.create_task(self.subscribe_one(url, payload)))
    # run all tasks in parallel
    await asyncio.gather(*tasks)

async def subsribe_one(self, url, payload):
    async with websockets.connect(url) as websocket:
        await websocket.send(payload)
        while True:
            msg = await websocket.recv()
            print(msg)

09-19 21:38