上一篇【python】Brython:浏览器中的Python-第八篇
当功能被限定为I / O绑定时,异步功能特别有用。这与CPU绑定功能相反。一个I / O绑定函数是大多花费时间等待输入或输出到结束,而函数CPU限制功能被计算。通过网络调用API或查询数据库是I / O绑定执行,而计算素数序列则受CPU绑定。
Brythonbrowser.ajax公开了HTTP函数,例如
get()和post(),它们在默认情况下是异步的。这些函数采用blocking可以设置为True同步呈现同一函数的参数。
要异步调用HTTP GET,请ajax.get()按以下方式调用:
要以阻止模式获取API,请将blocking参数设置为True:
以下代码显示了进行阻塞Ajax调用与进行非阻塞Ajax调用之间的区别:
上面的代码说明了同步和异步两种行为:
第13行定义了ajax_get(),该代码使用从远程文件中获取文本ajax.get()。的默认行为ajax.get()是异步的。ajax_get()返回,并在接收到远程文件后回调show_text()分配给该参数的参数。oncomplete/api.txt第18行定义了ajax_get_blocking(),它演示了如何使用ajax.get()阻塞行为。在这种情况下,show_text()在ajax_get_blocking()返回之前被调用。当您运行完整的事例并单击Async Get和Blocking Get时,您将看到以下屏幕:
您可以看到在第一种情况下,该操作ajax_get()已完全执行,并且API调用的结果是异步发生的。在第二种情况下,将显示API调用的结果,然后再从返回ajax_get_blocking()。
Brython中的异步IO
使用asyncio,Python 3.4开始公开新的异步功能。在Python 3.5中,async/await
语法丰富了异步支持。由于与浏览器事件循环不兼容,Brythonbrowser.aio替代了该标准asyncio。
Brython模块browser.aio和Python模块asyncio都支持使用async和await
关键字,并共享通用功能,例如
run()和sleep()。这两个模块都实现了其他不同的功能,这些功能与它们各自的执行上下文,的CPython上下文环境asyncio和的浏览器环境有关browser.aio。
协程
您可以使用run()和sleep()创建协程。为了说明在Brython中实现的协程的行为,您将实现CPython文档中可用的协程示例的变体:
除了第一import行外,代码与CPython文档中的代码相同。它演示了如何使用关键字async和await和表演run(),并sleep()在行动:
1层线的用途asyncio为的别名browser.aio。尽管有阴影aio,但它使代码与Python文档示例保持接近,以方便进行比较。
第4行声明了协程say_after()。注意的使用async。
第5行使用调用asyncio.sleep(),await以便当前函数将控制权让给另一个函数,直到sleep()完成为止。
第8行声明了另一个协程,该协程本身会调用协程say_after()两次。
第9行调用run(),这是一个将协程(main()在此示例中)作为参数的非阻塞函数。
请注意,在浏览器的上下文中,aio.run()利用内部JavaScript事件循环。这与asyncio.run()CPython中的相关功能不同,后者完全管理事件循环。
要执行此代码,请将其粘贴到在线Brython编辑器中,然后单击“运行”。您应该获得类似于以下屏幕截图的输出:
首先执行脚本,然后"hello"显示,最后"world"显示。
有关Python中协程的其他详细信息,您可以查看Python中的异步IO:完整的演练。
异步I / O的通用概念适用于所有采用此模式的平台。在JavaScript中,事件循环本质上是环境的一部分,而在CPython中,事件循环是使用公开的功能进行管理的asyncio。
上面的示例是一个有意的练习,目的是使代码完全与Python文档示例中所示的相同。在使用Brython在浏览器中编码时,建议显式使用browser.aio,如以下部分所述。
网络特定功能
如上一节所述,要发出对API的异步调用,可以编写如下的函数:
请注意关键字async和的使用await。需要将该函数定义为async与一起使用调用await。在执行此功能期间,当到达时await aio.get(url),该功能将控制权返回到主事件循环,同时等待网络调用aio.get()完成。程序的其余部分不会被阻塞。这是一个如何调用的例子process_get():
该函数aio.run()执行协程process_get()。这是无阻塞的。更完整的代码示例演示如何使用的关键字sync以及await如何aio.run()和aio.get()是互补的:
与最新版本的Python 3一样,您可以使用async和await关键字:
第7行process_get()使用关键字定义async。
第9行aio.get()使用关键字调用await。使用await需要用定义封闭函数async。
第14行显示了如何使用aio.run(),它async以要调用的函数作为参数。
要运行完整的示例,您需要启动Web服务器。您可以使用启动Python开发Web服务器python3 -m http.server。
它在端口8000和默认页面上启动本地Web服务器index.html:
屏幕截图显示了单击Async Get之后执行的步骤顺序。使用aio模块和关键字的组合,async并await展示了如何使用JavaScript促进的异步编程模型。
#python#
举报/反馈