我目前正在用Python开发一个使用 websockets 和 asyncio 包的服务器程序。
我有一个基本的脚本处理 websockets 工作(图表 A)。这个脚本在等待输入时锁定,这不是我想要的。
我想象的解决方案是我可以启动两个异步任务 - 一个处理输入,一个处理输出 - 并在辅助事件循环中启动它们。我不得不做一些关于协程的研究,我想出了图表 B 作为在事件循环中同时运行两个东西的概念证明。
现在我坚持的是 Exhibit C。当我尝试在 websockets 包的实际场景中使用它时,我发现 websocket.recv() 永远不会完成(或者协程永远不会取消暂停 - 我不确定到底是怎么回事)。在展览 A 中,它运行良好,而且我已经确定协程至少在此之前肯定会运行。
有任何想法吗?
附件A:
#!/usr/bin/python3
import asyncio
import websockets
import time
# This works great!
async def hello(websocket, path):
while True:
# This line waits for input from socket
name = await websocket.recv()
print("< {}".format(name))
# "echo... echo... echo... echo... echo..."
greeting = ''.join(name + "... " for x in range(5))
await websocket.send(greeting) …Run Code Online (Sandbox Code Playgroud) 我有一些javascript/jQuery代码用于进行图像转换.$(obj)是一个包含两个图像的框,它是每个图像的大小.下面的代码片段用于选择$(obj)边框之外的新位置,这与之前使用的位置不同(因为一个图像向右滑动而新图像从左侧滑动看起来好多了而不是一个向右滑动而另一个来自右边.)
var newLoc = Math.floor((Math.random() * 4));
if ($(obj).data('lastloc') == newLoc) {
console.log("FIXED "+newLoc);
if (newLoc == 3) newLoc = 2;
if (newLoc == 2) newLoc = 3;
if (newLoc == 0) newLoc = 1;
if (newLoc == 1) newLoc = 0;
console.log("WITH "+newLoc);
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是Chrome和Firefox都在JavaScript控制台中输出:
FIXED 3
WITH 3
Run Code Online (Sandbox Code Playgroud)
这怎么可能?