async

Python核心技术与实战——十五|Python协程

拈花ヽ惹草 提交于 2019-12-05 02:28:22
我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程。那什么是协程呢? 协程 协程是实现并发编程的一种方式。提到并发,肯很多人都会想到多线程/多进程模型,这就是解决并发问题的经典模型之一。在最初的互联网世界中,多线程/多进程就在服务器并发中起到举足轻重的作用。 但是随着互联网的发展,慢慢很多场合都会遇到C10K瓶颈,也就是同时连接到服务器的客户达到1W,于是,很多代码就跑崩溃,因为进程的上下文切换占用了大量的资源,线程也顶不住如此巨大的压力。这时候,NGINX就带着事件循环闪亮登场了。 事件循环启动一个统一的调度器,让调度器来决定一个时刻去运行哪个任务,于是省却了多线程中启动线程、管理线程、同步锁等各种开销。同一时期的NGINX,在高并发下也能保持资源消耗低、性能高,相比Apache也支持更多的并发连接。 再到后来,出现了一个很有名的名词——回调地狱(callback hell).很多写过JavaScript的朋友明白那是什么。大家惊喜的发现,这种工具很完美的继承了事件循环的优越性,同时还能提供async/await语法糖,解决了执行性和可读性共存的难题。于是,协程渐渐被更多人发现并看好,也有越来越多的人尝试用Node.js做起了后端开发。 回到Python中,使用生成器来实现协程已经是Python2时代的老方法了

GCD基本使用

痴心易碎 提交于 2019-12-04 19:04:12
GCD两个基本知识:任务和队列; 任务执行方式分为两种:同步(sync)和异步(async) 队列也分为两种:并发队列和串行队列; 各种组合方式: 异步函数+并发队列:开启多条线程,并发执行任务 异步函数+串行队列:开启一条线程,串行执行任务 同步函数+并发队列:不开线程,串行执行任务 同步函数+串行队列:不开线程,串行执行任务 异步函数+主队列:不开线程,在主线程中串行执行任务 同步函数+主队列:不开线程,串行执行任务(发生死锁) GCD基本函数: dispatch_barrier_async/dispatch_group_notify/dispatch_semaphore_wait 不会阻塞线程 dispatch_group_wait 会阻塞线程 dispatch_barrier_async 控制任务的执行顺序 queue必须是手动创建的并行队列; 所有位于dispatch_barrier_async函数之前的操作执行完毕后dispatch_barrier_async才会执行; dispatch_barrier_async函数执行之后,barrier函数之后的操作才会得到执行; 该函数需要同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用; dispatch_queue_t queue = dispatch

MVC的异步模式

北慕城南 提交于 2019-12-04 18:40:21
【小家Spring】高性能关键技术之---体验Spring MVC的异步模式(Callable、WebAsyncTask、DeferredResult) 基础使用篇 https://blog.csdn.net/f641385712/article/details/88692534 Spring基础学习-任务执行(TaskExecutor及Async) https://blog.csdn.net/icarusliu/article/details/79528810 Spring使用异步注解@Async正确姿势 https://blog.csdn.net/w605283073/article/details/86538140 SpringMVC异步处理之@Async(附源代码 - 单元测试通过) https://blog.csdn.net/caib1109/article/details/51623089 Spring Boot 基于DeferredResult的异步服务 https://www.jianshu.com/p/fb0645033f0f 来源: https://www.cnblogs.com/tonggc1668/p/11878007.html

ES6之async与await

守給你的承諾、 提交于 2019-12-04 17:01:51
· async - await 是 Promise 和 Generator 的语法糖,目的只是为了让我们书写代码时更加流畅,增强代码的可读性。 · async - await 是建立在Promise机制之上的,并不能取代其地位 基本语法: async function demo01() { let result = await Math.random() console.log(result) } demo01() // 输出一个随机数 async:   async用来表示函数是异步的,定义的函数会返回一个Promise对象,可以使用then方法添加回调函数 async function demo02() { return '返回结果' } demo02().then(res => console.log(res)) // 输出: 返回结果(若 async 定义的函数有返回值,相当于Promise.resolve('返回结果')) await:await必须出现在 async 函数内部,不能单独使用。   ·await后面可以跟任何js表达式。它最主要的意图是用来等待 Promise 对象的状态被 resolved。   ·如果await的是 Promise 对象会造成异步函数 停止 执行并且 等待 Promise 的解决,如果等的是 正常的表达式则立即执行 。   使用方法 :

pyppeteer进阶技巧

末鹿安然 提交于 2019-12-04 16:40:38
记录一下在使用pyppeteer过程中慢慢发现的一些稍微高级一点的用法。 一、拦截器简单用法 拦截器作用于单个Page,即浏览器中的一个标签页。每初始化一个Page都要添加一下拦截器。拦截器实际上是 通过给各种事件添加回调函数来实现的。 事件列表可参见:pyppeteer.page.Page.Events 常用拦截器: request:发出网络请求时触发 response:收到网络响应时触发 dialog:页面有弹窗时触发 使用request拦截器修改请求: # coding:utf8 import asyncio from pyppeteer import launch from pyppeteer.network_manager import Request launch_args = { "headless": False, "args": [ "--start-maximized", "--no-sandbox", "--disable-infobars", "--ignore-certificate-errors", "--log-level=3", "--enable-extensions", "--window-size=1920,1080", "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6)

(66) c# async await

人走茶凉 提交于 2019-12-04 15:18:34
static void Main(string[] args) { Program p = new Program(); Console.WriteLine(1); p.Go(); Console.WriteLine(2); Console.ReadLine(); } async Task Go() { Console.WriteLine(3); await a(); Console.WriteLine(4); } async Task a() { Console.WriteLine(5); int i = await b(); Console.WriteLine(i); } async Task<int> b() { Console.WriteLine(6); await Task.Delay(5000); Console.WriteLine(7); int i = 999; return i; } 2以后暂停几秒后继续执行 来源: https://www.cnblogs.com/buchizaodian/p/11871286.html

pyppeteer模块的基本使用

二次信任 提交于 2019-12-04 14:30:56
pyppeteer模块的基本使用 引言 Selenium 在被使用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如 Chrome、Firefox 等等,然后还要到官方网站去下载对应的驱动,最重要的还需要安装对应的 Python Selenium 库,确实是不是很方便,另外如果要做大规模部署的话,环境配置的一些问题也是个头疼的事情。那么本节就介绍另一个类似的替代品,叫做 Pyppeteer。 Pyppeteer简介 注意,本节讲解的模块叫做 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 API 极其完善,功能非常强大。 而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。 在 Pyppetter 中,实际上它背后也是有一个类似 Chrome 浏览器的 Chromium 浏览器在执行一些动作进行网页渲染,首先说下 Chrome 浏览器和 Chromium 浏览器的渊源。 Chromium 是谷歌为了研发 Chrome 而启动的项目

async和await的用法

梦想的初衷 提交于 2019-12-04 13:56:06
  function fn(){   return "aa";   }   console.log(fn()) 如果直接写个函数return一个值,那么打印的肯定就是aa。 async function fn(){ return "aa"; } console.log(fn()) 使用async就是在函数前面加一个async,这样打印出来的就是一个promise对象,而不是之前那个具体的值。 async function fn(){ return "aa"; } console.log(fn()) fn().then(function(data){ console.log(data)  // aa }); 如果想要获取fn()的值,就要用then()方法去获取。 awiat必须在使用async的情况下才能使用,它的作用是阻断主函数的执行,等待异步执行的结果返回后才会向下继续执行。 function fn(){ return new Promise((resolve)=>{ setTimeout(()=>{ console.log(1111) resolve(); },2000); }); } async function fn1(){ await fn(); setTimeout(()=>{ console.log(2222); },1000); } fn1();// 执行结果

python-aiohttp

瘦欲@ 提交于 2019-12-04 11:19:45
# _*_ coding: utf-8 _*_ """ 转载别人的——xianhu """ import asyncio import aiohttp # 简单实例 async def aiohttp_01 ( url ): async with aiohttp.ClientSession() as session: async with session.get(url) as resp: print (resp.status) print ( await resp.text()) loop = asyncio.get_event_loop() tasks = [aiohttp_01( " https://api.github.com/events " )] loop.run_until_complete(asyncio.wait(tasks)) loop.close() # 其他Http方法 # session.post('http://httpbin.org/post', data=b'data') # session.put('http://httpbin.org/put', data=b'data') # session.delete('http://httpbin.org/delete') # session.head('http://httpbin.org/get')

springboot异步线程

北慕城南 提交于 2019-12-04 11:15:01
前言 最近项目中出现了一个问题,发现自己的定时器任务在线上没有执行,但是在线下测试时却能执行,最后谷歌到了这篇文章 SpringBoot踩坑日记-定时任务不定时了? ; 本篇文章主要以自己在项目中遇到的问题为背景,并不涉及源码; Scheduled 定时任务 Scheduled 注解的具体使用方法自行百度或谷歌,这里只是使用其中的一种方式; 验证Scheduled为单线程执行 测试代码 @Component public class TestScheduling { private static final Logger log= LoggerFactory.getLogger(TestScheduling.class); @Scheduled(initialDelay = 1000 * 60, fixedDelay = 1000 * 30) public void testOne() { //打印线程名字 log.info("ThreadName:====one====" + Thread.currentThread().getName()); } @Scheduled(initialDelay = 1000 * 60, fixedDelay = 1000 * 30) public void testTwo(){ //打印线程名字 log.info("ThreadName:===