Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 已解决:异步WebSocket,而循环逻辑_Python_Loops_Websocket_Async Await - Fatal编程技术网

Python 已解决:异步WebSocket,而循环逻辑

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

python新手。我正在努力使一些事情奏效,但我不知道我的逻辑是否正确

所以我有一个websocket(ws),为了让这个websocket保持连接,它需要每分钟,当它收到一个“ping”时,我应该用“pong:

所以我做了这样的东西:

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,您可以在自己的答案中分享您为解决问题而编写的代码。在堆栈溢出问题上鼓励回答您自己的问题,您可以帮助其他人学习这种方法。