- 主题:async await到底咋用啊?
这几天妄want图to把一些小的程序放到cloudflare上去
发现他们提供的Request对象是个awaitable的东西
开发者要写一个on_fetch()
然后呢,我如果直接读那个Request对象,它就是个future
我如果要await它,则包含await的函数本身必须是async
如果我不用async,能不能在普通函数里把这个future对象求值呢?
--
FROM 139.227.18.*
所以这就是 async/await 讨厌的地方——有强烈的传染性。
你如果没有啥大并发的话,就用普通的 requests 就行了。
【 在 JulyClyde 的大作中提到: 】
: 这几天妄want图to把一些小的程序放到cloudflare上去
: 发现他们提供的Request对象是个awaitable的东西
: 开发者要写一个on_fetch()
: ...................
--
FROM 59.61.197.*
这种都是可以阻塞式获取返回值的吧 get()
类似 C# Task.Result
【 在 JulyClyde 的大作中提到: 】
: 这几天妄want图to把一些小的程序放到cloudflare上去
: 发现他们提供的Request对象是个awaitable的东西
: 开发者要写一个on_fetch()
: ...................
--
修改:ae175b1bf388 FROM 114.253.35.*
FROM 114.253.35.*
不过async里调用非异步的倒是没啥问题
【 在 hgoldfish 的大作中提到: 】
: 所以这就是 async/await 讨厌的地方——有强烈的传染性。
: 你如果没有啥大并发的话,就用普通的 requests 就行了。
:
--
FROM 223.104.38.*
好像不行
【 在 ae175b1bf388 的大作中提到: 】
: 这种都是可以阻塞式获取返回值的吧 get()
: 类似 C# Task.Result
:
--
FROM 223.104.38.*
不是requests http client
是我写个web服务,cloudflare workers把客户端发来的请求给我的程序的时候的request对象
【 在 hgoldfish 的大作中提到: 】
: 所以这就是 async/await 讨厌的地方——有强烈的传染性。
: 你如果没有啥大并发的话,就用普通的 requests 就行了。
--
FROM 139.227.18.*
嗯,是get方法吗?我都不知道future对象有什么方法
【 在 ae175b1bf388 的大作中提到: 】
: 这种都是可以阻塞式获取返回值的吧 get()
: 类似 C# Task.Result
--
FROM 139.227.18.*
【 在 JulyClyde 的大作中提到: 】
: 这几天妄want图to把一些小的程序放到cloudflare上去
: 发现他们提供的Request对象是个awaitable的东西
: 开发者要写一个on_fetch()
: ...................
async 之后的函数,就成了协程函数, 简单的说,
协程化以后, 一个线程里面可以并行多个协程任务(函数),
这些协程任务, 就是以task或者future为对象封装起来的,
这些多任务既然运行到同一个线程里面, 显然, 无法利用CPU或者系统的抢占多任务机制,
实际上, 协程多任务, 是一种协作多任务, 这个多任务的并行任务是需要有库框架协助完成的,
这个库就是asyncio做的, 而这个框架就是通过一个任务队列来完成的
loop = asyncio.get_event_loop()
而所有的协程任务, 就是通过不停的循环处理这个消息队列完成的。
mytask = loop.create_task()
从协程函数, 到任务的创建, 可以create_task 也可以构建future, 我印象里future更低级一些。
直接调用
loop.run_until_complete, 参数可以是一个list, 元素就是创建的tasks,
这个函数会把任务投入消息队列, 并启动协程任务执行。
这个函数默认就是任务完成了才会返回。 这个函数是默认连接普通函数和协程函数的纽带。
当然, loop里面还有其它类似的函数, 即使run_until_complete 也可以设置其它情况,
比如不等任务全完成, 设置超时就返回什么的...
loop.run_until_complete(asyncio.wait_for(asyncio.shield(asyncio.wait(task_wait_list)), 500))
run_until_complete 返回后, 就可以检查task或者future的result等返回值来确定任务的执行情况。
--
FROM 115.171.155.*
【 在 poggy 的大作中提到: 】
: async 之后的函数,就成了协程函数, 简单的说,
: 协程化以后, 一个线程里面可以并行多个协程任务(函数),
: 这些协程任务, 就是以task或者future为对象封装起来的,
: 这些多任务既然运行到同一个线程里面, 显然, 无法利用CPU或者系统的抢占多任务机制,
: 实际上, 协程多任务, 是一种协作多任务, 这个多任务的并行任务是需要有库框架协助完成的,
: 这个库就是asyncio做的, 而这个框架就是通过一个任务队列来完成的
: loop = asyncio.get_event_loop()
: 而所有的协程任务, 就是通过不停的循环处理这个消息队列完成的。
: mytask = loop.create_task()
: 从协程函数, 到任务的创建, 可以create_task 也可以构建future, 我印象里future更低级一些。
: 直接调用
: loop.run_until_complete, 参数可以是一个list, 元素就是创建的tasks,
: 这个函数会把任务投入消息队列, 并启动协程任务执行。
: 这个函数默认就是任务完成了才会返回。 这个函数是默认连接普通函数和协程函数的纽带。
那我如果不要loop呢,我直接要单个future的结果,怎么写呢?
或者说,loop内是怎么运行各个task的?
: 当然, loop里面还有其它类似的函数, 即使run_until_complete 也可以设置其它情况,
: 比如不等任务全完成, 设置超时就返回什么的...
: loop.run_until_complete(asyncio.wait_for(asyncio.shield(asyncio.wait(task_wait_list)), 500))
: run_until_complete 返回后, 就可以检查task或者future的result等返回值来确定任务的执行情况。
--
修改:JulyClyde FROM 139.227.18.*
FROM 139.227.18.*
我看了base_event.py里有个def run_until_complete(self, future):
是这个函数吗
run_until_complete是不是其实和await是一样的效果?
【 在 JulyClyde 的大作中提到: 】
: 那我如果不要loop呢,我直接要单个future的结果,怎么写呢?
: 或者说,loop内是怎么运行各个task的?
--
修改:JulyClyde FROM 139.227.18.*
FROM 139.227.18.*