Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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_Python 3.x_Websocket_Python Asyncio - Fatal编程技术网

如何组合python WebSocket和其他异步任务

如何组合python WebSocket和其他异步任务,python,python-3.x,websocket,python-asyncio,Python,Python 3.x,Websocket,Python Asyncio,我有一个大型python应用程序(现在已转换为python3),其中主代码在无限循环中运行 while (True): #Do loads of stuff, connect to rs485 devices, obtain their status etc. 我想在这个应用程序中使用WebSocket。我现在已将其转换为以下结构: def mainPoll(): #Do loads of stuff (omitted for brevity) while (True):

我有一个大型python应用程序(现在已转换为python3),其中主代码在无限循环中运行

while (True):
      #Do loads of stuff, connect to rs485 devices, obtain their status etc.
我想在这个应用程序中使用WebSocket。我现在已将其转换为以下结构:

def mainPoll():
    #Do loads of stuff (omitted for brevity)

while (True):
     mainPoll()
我的websockets示例代码(来自)的起点是:

import asyncio
import datetime
import random
import websockets
async def time(websocket, path):
    while True:
        now = datetime.datetime.utcnow().isoformat() + "Z"
        await websocket.send(now)
        await asyncio.sleep(random.random() * 3)

start_server = websockets.serve(time, "127.0.0.1", 5678)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
编辑我一直在尝试将两者结合起来。下面的Mycode将使用create\u任务异步运行mainPoll()是否有更好的方法继续运行它,即在mainPoll结束时再次调用create_任务

async def mainPoll():
#做大量的工作(为简洁起见省略)
#然后再创建一个任务来运行我自己?!?!?!
#下一行是最好的方式吗?
asyncio.get_event_loop().创建_任务(mainPoll())
#投票结束
异步def xtime(websocket,路径):
尽管如此:
now=str(time.time())
等待websocket.发送(现在)
等待asyncio.sleep(random.random()*3)
start_server=websockets.serve(xtime,“0.0.0.0”,5678)
asyncio.get_event_loop()。运行_直到完成(启动服务器)
poll=asyncio.get\u event\u loop().创建任务(mainPoll())
asyncio.get_event_loop().永远运行_()

我非常感谢这里的一些提示,因为websockets代码似乎与我能找到的任何asyncio示例都不匹配。非常感谢。

mainPoll
需要是一个异步函数。无需如问题所示重新创建任务-只要循环中有等待的内容,就可以包含
while True
循环。如果您需要在那里阻止API,请在不干扰WebSocket的情况下使用等待API。

您还需要使
mainPoll
async。然后对其调用
create_task()
,并运行事件循环中的所有内容。如果您在
mainPoll
中有阻塞的内容,请使用将其转换为可等待的。感谢您的回复。事实上,我问题中的最后一个示例已经将mainPoll声明为async,并且我已经在对其调用create_任务。这将运行一次。在事件循环中保持运行它的最佳方式是什么?在mainPoll结束的时候,我再次在上面创建了_任务,我不确定这是最好的方法。我将在执行器中查找run\u,谢谢。在异步函数中使用
而使用True
是非常好的;你试过了吗?我怀疑问题在于您的
mainPoll
没有等待任何东西,因为它调用了阻塞API。这就是我评论的第二部分所说的。谢谢。也许我把事情复杂化了。基本问题-如果我在异步方法中使用“while True”,从create_task开始,这会停止事件循环的运行吗?我是否需要在它的某个地方使用“wait”来避免它被阻塞?谢谢你的耐心!是的,你需要等待一些事情。这适用于执行阻塞操作的任何协程或异步回调,而不仅仅是那些具有
while True
的回调。要使asyncio正常工作,所有内容都必须符合其范例,传统的阻塞代码通常可以使用
run\u in\u executor
进行转换(尽管这种方法有其局限性)。由于您从未在
mainPoll
中显示代码,因此目前无法回答此问题。