Python 已解决:异步WebSocket,而循环逻辑
python新手。我正在努力使一些事情奏效,但我不知道我的逻辑是否正确 所以我有一个websocket(ws),为了让这个websocket保持连接,它需要每分钟,当它收到一个“ping”时,我应该用“pong: 所以我做了这样的东西:Python 已解决:异步WebSocket,而循环逻辑,python,loops,websocket,async-await,Python,Loops,Websocket,Async Await,python新手。我正在努力使一些事情奏效,但我不知道我的逻辑是否正确 所以我有一个websocket(ws),为了让这个websocket保持连接,它需要每分钟,当它收到一个“ping”时,我应该用“pong: 所以我做了这样的东西: async def run(): prepare_env("test") async with websockets.connect(wss_request_url, ssl=True) as ws: whil
async def run():
prepare_env("test")
async with websockets.connect(wss_request_url, ssl=True) as ws:
while True:
msg = await ws.recv()
if msg == "ping":
print("received: ping")
await send(ws, "pong")
else:
response = json.loads(msg)
if "something" in response:
await handle_message(ws, response)
else:
print(f"received:{response}")
asyncio.get_event_loop().run_until_complete(run())
基于响应中的“某物”,我有一个函数(verify_price),当价格发生变化时,它需要在RESTAPI中进行验证
async def verify_price(ws, old_price):
price_changed = False
while price_changed is False:
price = get_new_price()
if price <> old_price:
await send(ws, "pricechanged")
price_changed = True
async def verify_price(ws,old_price):
价格变化=错误
虽然更改的价格为假:
价格=获取新的价格()
如果价格为旧价格:
等待发送(ws,“价格更改”)
价格变化=真
我的问题是,当我在这个while循环中,等待价格变化时,如果我收到另一个ping,它不会用pong回复,它会断开我的连接
泰,
Danny“当我在这个循环中时,如果我收到另一个ping,它不会用pong回复”-你需要在自己的线程上运行价格检查循环。主线程需要负责侦听套接字并将任务分配给工作线程。甚至“用pong回复”“应该是另一个线程的任务。您的主循环应该只将工单存储到队列的末尾,然后尽快恢复侦听,同时一组工作线程不断从队列的前端拾取工单并执行它们……而且由于您不能拥有无限的线程,但是等待价格变化可能需要无限的时间,因此需要进行调整“虽然价格没有改变”循环将导致DOS机会。如果您有10个工人和10个“检查价格”“请求进来后,您的服务将不再响应,因为所有10个工作线程都将处于忙碌的循环中,等待。因此,价格检查应该是主工作队列上的单个任务。如果价格没有改变,工作线程必须在队列的末尾放置另一个“检查价格”任务,而不是自己进入一个循环……而且(最后一句话)由于10个传入的价格检查请求可能都是针对同一个项目的,并且您不想让您的工作线程疯狂地同时检查同一个项目,您需要一个您正在处理的内容的注册表,这样重复的请求不会导致重复的检查,而只会导致重复的响应(即:“客户端a、B和C已请求X。让我们执行X一次,一旦X完成,通知a、B和C”。@user2260630,您可以在自己的答案中分享您为解决问题而编写的代码。在堆栈溢出问题上,鼓励回答您自己的问题,您可以帮助其他人学习这种方法。“当我在这个循环中时,如果我收到另一个ping,它将不会用pong回复”-您需要在自己的线程上运行价格检查循环。主线程需要负责监听套接字并将任务分派给工作线程。即使是“用pong应答”也应该是另一个线程的任务。您的主循环应该只将工单存储到队列的末尾,然后尽快恢复侦听,同时一组工作线程不断从队列的前端拾取工单并执行它们……而且由于您不能拥有无限的线程,但是等待价格变化可能需要无限的时间,因此需要进行调整“虽然价格没有改变”循环将导致DOS机会。如果您有10个工人和10个“检查价格”“请求进来后,您的服务将不再响应,因为所有10个工作线程都将处于忙碌的循环中,等待。因此,价格检查应该是主工作队列上的单个任务。如果价格没有改变,工作线程必须在队列的末尾放置另一个“检查价格”任务,而不是自己进入一个循环……而且(最后一句话)由于10个传入的价格检查请求可能都是针对同一个项目的,并且您不想让您的工作线程疯狂地同时检查同一个项目,您需要一个您正在处理的内容的注册表,这样重复的请求不会导致重复的检查,而只会导致重复的响应(即:“客户端a、B和C已请求X。让我们执行X一次,一旦X完成,通知a、B和C”。@user2260630,您可以在自己的答案中分享您为解决问题而编写的代码。在堆栈溢出问题上鼓励回答您自己的问题,您可以帮助其他人学习这种方法。