我已经阅读了大量关于Python 3.5异步/等待的文章和教程。我不得不说我很困惑,因为有些人使用get_event_loop()并运行_直到_complete(),有些人使用sure_future(),有些人使用asyncio.wait(),还有一些人使用call_soon()。
看起来我有很多选择,但我不知道它们是否完全相同,或者有些情况下使用循环,有些情况下使用wait()。
但问题是,所有示例都使用asyncio.sleep()
模拟返回等待对象的真正慢速操作。一旦我试图用这行代码替换一些真正的代码,整个事情就失败了。上面写的方法之间的区别是什么?我应该如何运行一个还没有准备好异步/等待的第三方库。我确实使用Quandl服务获取一些股票数据。
import asyncio
import quandl
async def slow_operation(n):
# await asyncio.sleep(1) # Works because it's await ready.
await quandl.Dataset(n) # Doesn't work because it's not await ready.
async def main():
await asyncio.wait([
slow_operation("SIX/US9884981013EUR4"),
slow_operation("SIX/US88160R1014EUR4"),
])
# You don't have to use any code for 50 requests/day.
quandl.ApiConfig.api_key = "MY_SECRET_CODE"
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
我希望你明白我有多失落,我想有多简单的事情并行运行。
您可以从这里查看以下简单的工作示例。顺便说一下,它返回一个值得读取的字符串:-)
import aiohttp
import asyncio
async def fetch(client):
async with client.get('https://docs.aiohttp.org/en/stable/client_reference.html') as resp:
assert resp.status == 200
return await resp.text()
async def main():
async with aiohttp.ClientSession() as client:
html = await fetch(client)
print(html)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
如果第三方库与async/wait
不兼容,那么显然您不能轻松使用它。有两种情况:
>
def fn(..., clb):
...
所以你可以这样做:
def on_result(...):
...
fn(..., on_result)
在这种情况下,您可以将这些函数包装到异步协议中,如下所示:
from asyncio import Future
def wrapper(...):
future = Future()
def my_clb(...):
future.set_result(xyz)
fn(..., my_clb)
return future
(使用future.set_异常(exc)
on异常)
然后,您可以使用await
在一些async
函数中调用该包装器:
value = await wrapper(...)
请注意,wait
适用于任何Future
对象。您不必将包装器
声明为async
。
如果库中的函数是同步的,那么您可以在一个单独的线程中运行它(可能您会为此使用一些线程池)。整个代码可能看起来像这样:
import asyncio
import time
from concurrent.futures import ThreadPoolExecutor
# Initialize 10 threads
THREAD_POOL = ThreadPoolExecutor(10)
def synchronous_handler(param1, ...):
# Do something synchronous
time.sleep(2)
return "foo"
# Somewhere else
async def main():
loop = asyncio.get_event_loop()
futures = [
loop.run_in_executor(THREAD_POOL, synchronous_handler, param1, ...),
loop.run_in_executor(THREAD_POOL, synchronous_handler, param1, ...),
loop.run_in_executor(THREAD_POOL, synchronous_handler, param1, ...),
]
await asyncio.wait(futures)
for future in futures:
print(future.result())
with THREAD_POOL:
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
如果出于某种原因不能使用线程,那么使用这样的库只会使整个异步代码毫无意义。
但是请注意,将同步库与异步一起使用可能是个坏主意。你不会得到很多,但是你会使代码复杂化很多。
笔者在很长一段时间内都使用 koa@1 +(generator|bluebird)+ sequelize 这个组合,这个组合并没有什么问题,也很常见,但是到了滥用的地步,导致后来维护和调试起来都很痛苦。若排除 sequelize 这个我们不得不用的模块,从调试 cpuprofile 角度讲讲为什么笔者认为应该用 async/await + Promise 替代 co + generator|blu
本文向大家介绍Android震动与提示音实现代码,包括了Android震动与提示音实现代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了android消息提示的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
以封装为例,我可以想到用户和手机之间的交互。用户不需要知道手机的内部工作情况就可以进行操作,因此这称为抽象。但是封装在这个例子中的什么地方呢?有人能解释一下吗?
本文向大家介绍php base64 编码与解码实例代码,包括了php base64 编码与解码实例代码的使用技巧和注意事项,需要的朋友参考一下 php base64 编码与解码详解 1.自定义规则方式编码和解码 实例 2.利用系统函数完成base64位的编码和解码 实例代码: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
鉴于每个用户的使用习惯问题,EasySwoole本身并不提供封装好的数据库操作与Model层,但我们强力推荐在项目中使用第三方开源库https://github.com/joshcam/PHP-MySQLi-Database-Class 作为数据操作类库,并构建自己的Model。 使用指导 项目引入 克隆(下载)MySQLi项目,并解压提取其中的MysqliDb.php文件,放入项目 ‘/App/
本文向大家介绍Python中字符串与编码示例代码,包括了Python中字符串与编码示例代码的使用技巧和注意事项,需要的朋友参考一下 在最新的Python 3版本中,字符串是以Unicode编码的,即Python的字符串支持多语言 编码和解码 字符串在内存中以Unicode表示,在操作字符串时,经常需要str和bytes互相转换 如果在网络上传输或保存到磁盘上,则从内存读到的数据就是st