Python-机器人、异步IO、Javascript和循环

Python-机器人、异步IO、Javascript和循环,javascript,python,websocket,bots,python-asyncio,Javascript,Python,Websocket,Bots,Python Asyncio,大家好,谢谢你们抽出时间。在过去的几天里,我一直在进行我的一个小项目,为LINE创建一个在线聊天机器人。我理解API,但遇到了问题。我正在尝试让我的chabot使用对用户文本的在线响应。为了实现这一点,我尝试在python和JavaScript之间使用websocket。我使用的API是python,因此websocket也必须用python编写。我选择了asyncio WebSocket。简而言之,我正在尝试从用户输入中获取响应-->通过websocket将响应发送到浏览器控制台中的javas

大家好,谢谢你们抽出时间。在过去的几天里,我一直在进行我的一个小项目,为LINE创建一个在线聊天机器人。我理解API,但遇到了问题。我正在尝试让我的chabot使用对用户文本的在线响应。为了实现这一点,我尝试在python和JavaScript之间使用websocket。我使用的API是python,因此websocket也必须用python编写。我选择了asyncio WebSocket。简而言之,我正在尝试从用户输入中获取响应-->通过websocket将响应发送到浏览器控制台中的javascript-->javascript将继续执行其逻辑并将响应发送回服务器-->程序将继续执行。我的问题是Websocket编程和我的行编程都使用循环。行代码可以在以下位置看到:

正如您在代码末尾看到的,有一个while语句,它对每条消息一次又一次地跟踪READ_MESSAGE函数。你可以忽略通知,留下一个。因此,基本上我的代码是按照自己的逻辑编写的,然后执行如下操作:

else:
#ExternalBot code
ExtText = text[6:]
我现在希望通过我的websocket将这个ExtText发送到我的javascript,javascript将从浏览器获取响应并将其发送回。javascript将执行如下操作:

exampleSocket = new WebSocket("ws://192.168.1.9:8765/") 
exampleSocket.onmessage = function(e){
var server_message = e.data;
console.log(server_message);
(logic)
exampleSocket.send(response);
现在问题就从这里开始了,因为我根本不知道如何继续。python asyncio Websockets需要一个循环来运行,如下所示:

async def Send(websocket, path):
    await websocket.send(ExtText)
    await Receive(websocket, path)

async def Receive(websocket, path):
    resposne = await websocket.recv()
    if response is None:
        await Recieve(websocket, path)
    else:
        print (Response)

    start_server = websockets.serve(Send,'192.168.1.9','8765')
    loop = asyncio.get_event_loop()
    loop.run_untill_complete(start_server)
    loop.run_forever()

   (continue to do a line.send() the response back to the client on Line.)

这是我目前拥有的代码。现在的问题是,如果我从不关闭循环,那么像loop.call_soon_threadsafe(loop.stop)这样的循环将继续运行,而消息将永远不会发送回客户端(程序将不会继续执行其行逻辑)。如果我真的关闭了循环,服务器实际上是“关闭”的。如果服务器关闭并重新打开我必须通过websocket发送的每一条消息,我现在面临的问题是让我的JavaScript不断尝试重新连接到服务器上的每一条消息。我已经尝试过了,但从未成功地让Javascript继续尝试建立连接。我曾尝试使用Javascript websocket readyState属性,但也没有成功。我来这里仅仅是因为我不知道如何继续,以及进一步做什么。你们建议我如何继续,关闭循环或以某种方式保持它打开,但继续我的程序的逻辑。如果是这样,您将如何将其实现到我已经循环的代码(whiletrue语句行)中?我真的为这么长的问题道歉,但我完全被卡住了。感谢您抽出时间来阅读并帮助我的朋友们,我真的很感激。

经过几天的研究,我将循环分成两个python脚本并在它们之间进行通信,从而解决了这个问题。如果在座的任何人有类似的问题并希望得到更深入的解释,请随时问我。

好吧,这不是一个容易的问题。这一行客户端似乎与asyncio不兼容。我建议您尝试使用将行客户端轮询进程移动到另一个线程。但是你必须小心线程安全谢谢你的回复。是否可以将服务器移动到另一个单独的python程序,并以某种方式在两者之间进行通信?这当然是可能的,但仍然会有一个问题-您必须在运行主程序循环和检查两个程序之间的通信通道以获取新数据之间切换。有效地解决这个问题是非常重要的,需要一些并发编程的技能。这是一个非常有趣的问题,所以我会尝试编写它,当我有时间和良好的moodOk时,谢谢。也许elif语句(当条件要求调用外部文本时)可以触发通信?