python 浏览器,【python】Brython:浏览器中的Python-第九篇

3af844e0f199b7b1b8877a9affbc2d84.png

上一篇【python】Brython:浏览器中的Python-第八篇

当功能被限定为I / O绑定时,异步功能特别有用。这与CPU绑定功能相反。一个I / O绑定函数是大多花费时间等待输入或输出到结束,而函数CPU限制功能被计算。通过网络调用API或查询数据库是I / O绑定执行,而计算素数序列则受CPU绑定。

Brythonbrowser.ajax公开了HTTP函数,例如

get()和post(),它们在默认情况下是异步的。这些函数采用blocking可以设置为True同步呈现同一函数的参数。

要异步调用HTTP GET,请ajax.get()按以下方式调用:

9841dd3176e95f3512df1eef144eae8f.png

要以阻止模式获取API,请将blocking参数设置为True:

2707f8b968495c36328b8bf788d54fda.png

以下代码显示了进行阻塞Ajax调用与进行非阻塞Ajax调用之间的区别:

9ac1e7cc0fbd712961ab79aaecbcca61.png

上面的代码说明了同步和异步两种行为:

第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时,您将看到以下屏幕:

568ebef0b0f87a329c74ec67851d14a8.png

您可以看到在第一种情况下,该操作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文档中可用的协程示例的变体:

3529379162727bd6e095c7326bb9f1ee.png

除了第一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编辑器中,然后单击“运行”。您应该获得类似于以下屏幕截图的输出:

42e0663f04f125d95c1867f8129795aa.png

首先执行脚本,然后"hello"显示,最后"world"显示。

有关Python中协程的其他详细信息,您可以查看Python中的异步IO:完整的演练。

异步I / O的通用概念适用于所有采用此模式的平台。在JavaScript中,事件循环本质上是环境的一部分,而在CPython中,事件循环是使用公开的功能进行管理的asyncio。

上面的示例是一个有意的练习,目的是使代码完全与Python文档示例中所示的相同。在使用Brython在浏览器中编码时,建议显式使用browser.aio,如以下部分所述。

网络特定功能

如上一节所述,要发出对API的异步调用,可以编写如下的函数:

5714c81f037ac030fe4caa4fc036b071.png

请注意关键字async和的使用await。需要将该函数定义为async与一起使用调用await。在执行此功能期间,当到达时await aio.get(url),该功能将控制权返回到主事件循环,同时等待网络调用aio.get()完成。程序的其余部分不会被阻塞。这是一个如何调用的例子process_get():

821032159f5db8a79de26eb81617b280.png

该函数aio.run()执行协程process_get()。这是无阻塞的。更完整的代码示例演示如何使用的关键字sync以及await如何aio.run()和aio.get()是互补的:

c16ed541526501e9f87f0f6704542a72.png

与最新版本的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:

55f20183e23c65011800ec80463ad450.png

屏幕截图显示了单击Async Get之后执行的步骤顺序。使用aio模块和关键字的组合,async并await展示了如何使用JavaScript促进的异步编程模型。

#python#

举报/反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值