Python 为什么我需要等待一次合作?

Python 为什么我需要等待一次合作?,python,python-3.x,asynchronous,python-asyncio,Python,Python 3.x,Asynchronous,Python Asyncio,我从websockets和asyncio开始,很难理解其背后的逻辑。过去,我在Python上使用线程,在Javascript上使用AJAX调用(因此我了解了多线程(I/O绑定)的概念,以及对异步执行结果的过程的调用) 下面是示例服务器。我的目标是提供一个websocket连接和两个函数,它们将每10秒调用一次,而无需等待结果(因此,无论函数处理多长时间,每10秒只调用一次) 我希望,一旦客户端连接,在接下来的整整10秒钟内,函数就会启动。它们将在2秒和3秒后完成,然后在接下来的整整10秒内开火,

我从websockets和
asyncio
开始,很难理解其背后的逻辑。过去,我在Python上使用线程,在Javascript上使用AJAX调用(因此我了解了多线程(I/O绑定)的概念,以及对异步执行结果的过程的调用)

下面是示例服务器。我的目标是提供一个websocket连接和两个函数,它们将每10秒调用一次,而无需等待结果(因此,无论函数处理多长时间,每10秒只调用一次)

我希望,一旦客户端连接,在接下来的整整10秒钟内,函数就会启动。它们将在2秒和3秒后完成,然后在接下来的整整10秒内开火,以此类推

我得到的是

D:/Dropbox/dev/domotique/webserver.py:708: RuntimeWarning: coroutine 'time1' was never awaited
  time1(websocket)
D:/Dropbox/dev/domotique/webserver.py:710: RuntimeWarning: coroutine 'time2' was never awaited
  time2(websocket)
而且没有任何信息被发送或打印


为什么我必须等待协同程序?我想从
update_info
表单中启动它们,然后忘记它们(=让它们自行处理,让它们通过websocket发送数据)我的方法有什么问题?

wait
有效地将等待的协程与事件循环耦合,等待它完成,然后继续。如果您不等待协同程序,那么这种情况就不会发生

如果您只想在后台运行协同程序(更像是一个
任务
),那么请使用
asyncio。确保未来(my\u coroutine())
,这将衍生出一个
任务
,并让您继续处理其他项目

EDIT:async新手遇到的一个难题是,如果您有多个正在运行的任务,那么除非这些任务有内部
wait
语句,否则事件循环将被该任务卡住,除非它返回。事件循环给人的印象是同时做两件事的方式是在不同的代码位之间来回切换。
await
语句是事件循环可以处理的点。因此,当一段代码正在等待时,另一段代码将继续运行。一旦另一段代码点击了
await
,那么队列中的下一段代码就可以开始了,等等。换句话说,请注意
await
的位置,并以这样一种方式设计代码:长时间运行的代码位不会阻止从异步中受益的更动态的组件

D:/Dropbox/dev/domotique/webserver.py:708: RuntimeWarning: coroutine 'time1' was never awaited
  time1(websocket)
D:/Dropbox/dev/domotique/webserver.py:710: RuntimeWarning: coroutine 'time2' was never awaited
  time2(websocket)