async

带有额外状态的回调函数

删除回忆录丶 提交于 2019-12-06 13:09:53
编码中常碰到的一个情形是需要编写回调函数,如事件处理函数等。一般的回调函数如常规函数,传递参数,返回计算的值。 def apply_async(func, args, *, callback): # Compute the result result = func(*args) # Invoke the callback with the result callback(result) def print_result(result): print('Got:', result) def add(x, y): return x + y >>> apply_async(add, (2, 3), callback=print_result) Got: 5 >>> apply_async(add, ('hello', 'world'), callback=print_result) Got: helloworld >>> 注意到,print_result()函数仅接受一个参数,即result。 没有其他信息传递。当希望回调函数与环境的其他变量或部分交互时,信息的缺乏有时会带来问题。 在回调中携带额外状态或信息的一种方式是使用绑定的方法而不是一个简单的函数。比如说使用类定义。如下所示: class ResultHandler: def __init__(self): self

ES6常见面试题

只愿长相守 提交于 2019-12-06 13:07:02
1.es5和es6的区别,说一下你所知道的es6 ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化 ECMAScript6,即ES6,是ECMAScript的第六次修订,于2015年完成,也称ES2015 ES6是继ES5之后的一次改进,相对于ES5更加简洁,提高了开发效率 ES6新增的一些特性: 1)let声明的变量和const声明的常量,两个都有块级作用域ES5中是没有块级作用域的,并且var有变量提升,在let中 使用的变量一定要进行声明。 2)箭头函数ES6中的函数定义不再使用关键字function(),而利用了()=>来进行定义 3)模板字符串是增强版的字符串,用(`)标识,可以当做普通字符串使用,也可以用来定义多行字符串 4)解构赋值ES6中允许按照一定模式,从数组和对象中提取值,对变量进行赋值。 5)for of 循环和for ...of 循环可以遍历数组、Set和Map结构、某些类似数组的对象、对象,以及字符串。 6)import、export导入导出ES6标准中,JS原生支持模块(module)。将JS代码分隔成不同功能的小块进行模块化, 将不同功能的代码分别写在不同的文件中,各模块只需导出公共接口的部分,然后通过模块的导入的方式可以在其他地方使用。 7)set数据结构,类似数组。所有的数据都是唯一的,没有重复的值

C# 5.0 async void vs async Task

两盒软妹~` 提交于 2019-12-06 12:19:07
1 private void button1_Click(object sender, EventArgs e) 2 { 3 TestReturnsVoid();//会在UI Thread抛出异常,导致程序崩溃 4 } 5 6 private void button2_Click(object sender, EventArgs e) 7 { 8 TestReturnsTask();//会在另外一个线程抛出异常,类似TheadPool的效果 9 } 10 11 private async void TestReturnsVoid() 12 { 13 await Test(); 14 } 15 16 private async Task TestReturnsTask() 17 { 18 await Test(); 19 } 20 21 private async Task Test() 22 { 23 throw new NotImplementedException(); 24 }结论1. async void 仅仅推荐用在UI event handler2.总是处理事件 : TaskScheduler.UnobservedTaskException 来源: https://www.cnblogs.com/0xMe/p/11982974.html

爬虫高性能asyncio

心不动则不痛 提交于 2019-12-06 09:36:47
async实现协程,异步编程 我们都知道,现在的服务器开发对于IO调度的优先级控制权已经不再依靠系统,都希望采用协程的方式实现高效的并发任务,如js、lua等在异步协程方面都做的很强大。 python在3.4版本也加入了协程的概念,并在3.5确定了基本完善的语法和实现方式。同时3.6也对其进行了如解除了await和yield在同一个函数体限制等相关的优化。 asyncio是python3.4版本引入到标准库,python2x没有加这个库,毕竟python3x才是未来啊,哈哈!python3.5又加入了async/await特性。 在学习asyncio之前,要先搞清楚 同步/异步的概念 : event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。 task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。 future: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别 async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程

Ajax中的async:false作用

随声附和 提交于 2019-12-06 08:49:55
(非原创) 引自:https://www.cnblogs.com/mmzuo-798/p/7098979.html async的默认方式是true,即异步方式,当ajax方法执行后会继续执行方法之后的脚本,直到服务器返回数据后,触发服务的success方法,这时执行的是两个线程. async设置为false时,为同步方式,当ajax方法执行后,在没有返回值之前,浏览器页面会被锁定,只有返回值请求完毕用户才可以在页面进行操作. 示例一:这个ajax请求为同步请求,在没有返回值之前,不执行下面的代码 $ajax({ type:"post", url:"/map/checkMapName", data:{mapName:mapName}, dataType:"json", async:false, success:function(data){ aa=data; if(data=1){ lay.msg("轮播图名称不能重复!"); return; } } }) 示例二:这个ajax请求为同步请求,在没有返回值之前,alert(temp)是不会执行的 果async设置为:true,则不会等待ajax请求返回的结果,会直接执行ajax后面的语句。 var temp; $.ajax({ async: false, type : "post", url : defaultpostdata.url

Celery详解(2)

元气小坏坏 提交于 2019-12-06 08:31:27
  除了redis,还可以使用另外一个神器----Celery。Celery是一个异步任务的调度工具。   Celery是Distributed Task Queue,分布式任务队列,分布式决定了可以有多个worker的存在,列表表示其是异步操作,即存在一个产生任务提出需求的工头,和一群等着被分配工作的码农。   在python中定义Celery的时候,我们要引入Broker,中文翻译过来就是"中间人"的意思,在这里Broker起到一个中间人的角色,在工头提出任务的时候,把所有的任务放到Broker里面,在Broker的另一头,一群码农等着取出一个个任务准备着手做。   这种模式注定了整个系统会是个开环系统,工头对于码农们把任务做的怎样是不知情的,所以我们要引入Backend来保存每次任务的结果。这个Backend有点像我们的Broker,也是存储信息用的,只不过这里存的是那些任务的返回结果。我们可以选择只让错误执行的任务返回结果到Backend,这样我们取回结果,便可以知道有多少任务执行失败了。 Celery 介绍 在Celery中几个基本的概念,需要先了解下,不然不知道为什么要安装下面的东西。概念:Broker,Backend。 Broker:   broker是一个消息传输的中间件,可以理解为一个邮箱。每当应用程序调用celery的异步任务的时候,会向broker传递消息

利用 Rize 来进行 UI 测试或 E2E 测试

一笑奈何 提交于 2019-12-06 06:59:23
之前我曾经在 《Rize - 一个可以让你简单、优雅地使用 puppeteer 的 Node.js 库》 一文简单介绍过 Rize 这个库。当时仅仅是介绍这个库本身,关于如何使用,我没有给太多的指导。 这篇文章讲的是如何使用 Rize 来做 UI 测试或 E2E 测试。 在正式开始之前,先给可能没了解过 Rize 的同学做个简单的介绍:Rize 是一个提供了相对顶层并且可链式调用的 API 的库,可与 puppeteer 一起使用。目前开源在 GitHub,地址是 https://github.com/g-plane/rize ,欢迎大家前往 GitHub 给个 star。 安装 首先是安装 Rize 和 puppeteer。 如果您使用 Yarn: $ yarn add --dev rize puppeteer 如果您使用 npm: $ npm install --save-dev rize puppeteer 考虑到国内的网络原因,您可能需要使用国内的 Chromium 镜像: 对于 Linux 或 macOS 用户: PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org yarn add --dev puppeteer rize Windows 用户: SET PUPPETEER_DOWNLOAD

django channels

别等时光非礼了梦想. 提交于 2019-12-06 03:05:39
django channels django channels 是django支持websocket的一个模块。 1. 安装 1 pip3 install channels 2. 快速上手 2.1 在settings中添加配置 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'channels', ] ASGI_APPLICATION = "django_channels_demo.routing.application" 2.2 创建websocket应用和路由 #!/usr/bin/env python # -*- coding:utf-8 -*- from channels.routing import ProtocolTypeRouter, URLRouter from django.conf.urls import url from chat import consumers application = ProtocolTypeRouter({

python 回调函数的简单使用

吃可爱长大的小学妹 提交于 2019-12-06 02:36:21
def apply_async(func, args=(), callable=None): """需要调用的回调函数的函数""" result = func(*args) # 元组拆包*args callable(result) def print_result(result): """打印日志信息""" print("Got:", result) def add(x, y): """计算函数""" return x + y class ResultHandler: """第一种 保存内部序列号""" def __init__(self): self.sequence = 0 def handler(self, result): self.sequence += 1 print('[{}] Got:{}'.format(self.sequence, result)) def make_handler(): """第二种 类的替代,可以使用闭包捕获状态值""" sequence = 0 def handler(result): nonlocal sequence # 只能用于嵌套函数中 sequence += 1 print('[{}] Got:{}'.format(sequence, result)) return handler def make_handler_2(): ""

promise以及async、await学习总结

假如想象 提交于 2019-12-05 23:40:09
Promise/async、await帮我们解决了什么 它给我们提供了一种新的异步编程解决方案,同时避免了困扰已久的回调地狱 // 异步的处理可能会产生这样的回调地狱(第二个异步操作和第一个异步的结果有关系) let Ajax = function(data, success, error){ $.ajax({ data: data, success: function(res){ success(res) }, error: function(err){ error(err) } }) } Ajax(data,function(res){ Ajax(data,function(res){ // 继续循环回调 },function(err){}) },function(err){}) // 看看promise的处理方式 let promise = function (data) { return new Promise((resolve,reject) => { $.ajax({ data: data, success: function(res){ resolve(res) }, error: function(err){ reject(err) } }) }) } let data = {} // ajax请求参数 promise(data).then((res) =>