我正在尝试在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)