async

Node.js之async_hooks

偶尔善良 提交于 2019-12-19 15:22:24
async_hooks 异步钩子; 提供了一组API用来跟踪Nodejs的异步资源(asynchronous resources)的生命周期; 特性: 每个函数都会提供一个上下文,为async scope(node为每个函数都提供了一个async scope); 每个async scope都有一个asyncId标志,最外层的asyncId是1,每个异步资源在创建时asyncId是全量递增的; 同步函数不会改变其调用者的asyncId; 同一个函数,不同时刻进行异步调用,会分配不同的asyncId; triggerAsyncId当前函数调用者的asyncId; executionAsyncId当前函数的asyncId; const fs = require('fs') const async_hooks = require('async_hooks') const eid = async_hooks.executionAsyncId() const tid = async_hooks.triggerAsyncId() console.log(`executionAsyncId: ${eid}, triggerAsyncId: ${tid}`) const asyncHooks = async_hooks.createHook({ // fs.writeSync向控制台打印消息

Socket网络编程--Libev库学习(3)

僤鯓⒐⒋嵵緔 提交于 2019-12-19 09:00:33
  这一小节继续讲解各个观察器(Watcher).   上一小节已经讲解了ev_io(IO可读可写观察器),ev_stat(文件属性变化观察器),ev_signal(信号处理观察器),ev_timer(定时器),ev_periodic(周期任务处理),ev_child(子进程状态变化观察器)。这一小节准备讲ev_fork(创建的进程时的观察器),ev_async(异步调用观察器),ev_cleanup(event loop退出时触发事件),ev_prepare(每次event loop之前事件),ev_check(每次event loop之后事件),ev_idle(每次event loop空闲触发事件).   ev_async (ev_async当ev_async_send通过watcher调用时调用,触发EV_ASYNC) 1 #include <stdio.h> 2 #include <string.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 #include <ev.h> 6 7 ev_async async_watcher; 8 9 static void sigint_callback(struct ev_loop *loop,ev_signal * w,int revents) 10 { 11 if(revents

使用 Async 和 Await 的异步编程

狂风中的少年 提交于 2019-12-19 02:18:42
来自:http://msdn.microsoft.com/library/vstudio/hh191443 异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要。 对 Web 资源的访问有时很慢或会延迟。 如果此类活动在同步过程中受阻,则整个应用程序必须等待。 在异步过程中,应用程序可继续执行不依赖 Web 资源的其他工作,直至潜在阻止任务完成。 下表显示了异步编程提高响应能力的典型区域。 从 .NET Framework 4.5 和 Windows 运行时中列出的 API 包含支持异步编程的方法。 应用程序区域 包含异步方法的受支持的 API Web 访问 HttpClient , SyndicationClient 使用文件 StorageFile 、 StreamWriter 、 StreamReader 、 XmlReader 使用图像 MediaCapture 、 BitmapEncoder 、 BitmapDecoder WCF 编程 同步和异步操作 由于所有与用户界面相关的活动通常共享一个线程,因此,异步对访问 UI 线程的应用程序来说尤为重要。 如果任何进程在同步应用程序中受阻,则所有进程都将受阻。 你的应用程序停止响应,因此,你可能在其等待过程中认为它已经失败。 使用异步方法时,应用程序将继续响应 UI。 例如,你可以调整窗口的大小或最小化窗口

C#线程学习笔记十:async & await入门三

流过昼夜 提交于 2019-12-18 14:39:59
一、Task.Yield Task.Yield简单来说就是创建时就已经完成的Task,或者说执行时间为0的Task,或者说是空任务,也就是在创建时就将Task的IsCompeted值设置为0。 我们知道await的Task完成时会释放线程,然后从线程池中申请新的线程继续执行await之后的代码,那产生的空任务又意义何在呢? 事实上,Task.Yield产生的空任务仅仅是借await做嫁衣来达到线程切换的目的,即让await之后的操作重新去线程池排队申请新线程来继续执行。 这样一来,假如有一个优先级低但执行时间长的任务,可以将它拆分成多个小任务,每个小任务执行完成后就重新去线程池中排队申请新线程来执行 下一个小任务,这样任务就不会一直霸占着某个线程了(出让执行权),让别的优先急高或执行时间短的任务可以去执行,而不是干瞪眼着急。 class Program { static void Main(string[] args) { #region async & await入门三之Task.Yield const int num = 10000; var task = YieldPerTimes(num); for (int i = 0; i < 10; i++) { Task.Factory.StartNew(n => Loop((int)n), num / 10); } Console

GCD 初步学习

谁说我不能喝 提交于 2019-12-17 20:14:18
GCD应该是比較牛逼的东西了吧,一时半会应该是操作不好。 在cocoa-china上面有两篇关于GCD的文章。 GCD 深入理解(一) GCD 深入理解(二) CSDN荣芳志博客: 点击打开链接 我仅仅是读了第一篇文章,在这对里面讲的几个操作函数做一下记录: GCD是用来优化程序支持多核处理器和多处理系统的系统,建立在线程池模式上。 原理是:将任务(函数或者block)放入队列,队列(先进先出)有两种:并行和串行; 串行队列-队列中的任务是串行的。执行完一个后接着执行下一个。可是队列与队列之间是并行的 并行队列-队列中的任务是并行的。所以结束的顺序不确定。 系统提供了四个全局 并发队列 有不同的优先级 background、low、default 以及 high #define DISPATCH_QUEUE_PRIORITY_HIGH 2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 #define DISPATCH_QUEUE_PRIORITY_LOW (-2) #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 系统还提供给你一个叫做主队列的特殊队列。是一个 串行队列 ,主要用与UI更新。 经常用法: 我们自己能够来创建队列 <span style="font-family:SimSun

ios的线程和同步异步操作

会有一股神秘感。 提交于 2019-12-17 14:44:23
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ios的线程和同步异步操作 ios的线程和同步异步操作 ios的多线程,同步异步操作,都是我们日常的开发中经常会遇到的问题,本文把常见的ios线程,同步异步的操作进行了整理。 代码下载: 我博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo, 点击跳转代码下载地址 本文代码存放目录是 ThreadAndAsynchronization 如果大家支持,请follow我的github账号,并fork我的项目,有其他问题可以在github上给我留言或者给我发邮件,coolnameismy@hotmail.com,blog的RSS订阅地址:http://liuyanwei.jumppo.com/pages/rss.xml 基础知识 1.线程和进程 ,多线程 线程和进程 :网上有一大堆很专业的说法,大多数说的都比较复杂,越复杂的解释其实说的越准确和严谨,但是常常会把人弄糊涂。这里我也不去解释了,大多数场景你可以理解为,一个应用程序就是一个进程,而一个进程可以分为多个线程 多线程 :大多数框架都支持一个进程启多个线程,比如 c#、java、obejctive-c,但是并不是所有的框架都支持,比如flex的框架就不支持多线程。

在forEach循环中使用异步/等待

心不动则不痛 提交于 2019-12-17 09:54:02
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在 forEach 循环中使用 async / await 是否有任何问题? 我正在尝试遍历文件数组并 await 每个文件的内容。 import fs from 'fs-promise' async function printFiles () { const files = await getFilePaths() // Assume this works fine files.forEach(async (file) => { const contents = await fs.readFile(file, 'utf8') console.log(contents) }) } printFiles() 这段代码确实有效,但是这可能会出问题吗? 我让某人告诉我,您不应该在这样的高阶函数中使用 async / await ,所以我只想问一下这是否有问题。 #1楼 确保代码确实有效,但是我很确定它不会实现您期望的功能。 它只是触发多个异步调用,但是在 printFiles 之后 printFiles 函数确实会立即返回。 如果 forEach 顺序读取文件, 则 实际上 不能使用 forEach 。 只需使用现代的 for … of 循环,在其中 await 将按预期工作: async function

C#线程学习笔记七:Task详细用法

谁说我不能喝 提交于 2019-12-17 00:11:48
一、异步方法返回类型 只能返回3种类型(void、Task和Task<T>)。 1.1、void返回类型:调用方法执行异步方法,但又不需要做进一步的交互。 class Program { static void Main(string[] args) { #region async & await入门二之void返回类型 AddAsync(1, 2); Thread.Sleep(1000); Console.WriteLine("AddAsync方法执行完成。"); Console.Read(); #endregion } /// <summary> /// 加法 /// </summary> /// <param name="n"></param> /// <param name="m"></param> /// <returns></returns> private static int Add(int n, int m) { return n + m; } /// <summary> /// 异步加法 /// </summary> /// <param name="n"></param> /// <param name="m"></param> private static async void AddAsync(int n, int m) { int val = await

Spring异步任务处理,@Async的配置和使用

与世无争的帅哥 提交于 2019-12-16 15:59:21
这个注解用于标注某个方法或某个类里面的所有方法都是需要异步处理的。被注解的方法被调用的时候,会在新线程中执行,而调用它的方法会在原来的线程中执行。这样可以避免阻塞、以及保证任务的实时性。适用于处理log、发送邮件、短信……等。 注解的应用范围: 类:表示这个类中的所有方法都是异步的 方法:表示这个方法是异步的,如果类也注解了,则以这个方法的注解为准 相关的配置: <task:annotation-driven />配置: executor:指定一个缺省的executor给@Async使用。 例子: <task:annotation-driven executor="asyncExecutor" /> <task:executor />配置参数: id:当配置多个executor时,被@Async("id")指定使用;也被作为线程名的前缀。 pool-size: core size:最小的线程数,缺省:1 max size:最大的线程数,缺省:Integer.MAX_VALUE queue-capacity:当最小的线程数已经被占用满后,新的任务会被放进queue里面,当这个queue的capacity也被占满之后,pool里面会创建新线程处理这个任务,直到总线程数达到了max size,这时系统会拒绝这个任务并抛出TaskRejectedException异常(缺省配置的情况下

三种异步编程模型

江枫思渺然 提交于 2019-12-16 13:59:00
Net 中很多的类接口设计的时候都考虑了多线程问题,简化了多线程程序的开发。 不用自己去写 WaitHandler 等这些底层的代码。由于历史的发展,这些类的接口设计有着三种不同的风格: EAP(*) 、 APM(*) 和 TPL 。目前重点用 TPL 。 EAP EAP 是 Event-based Asynchronous Pattern ( 基于事件的异步模型) 的简写, 类似于 Ajax 中的 XmlHttpRequest , send 之后并不是处理完成了,而是在 onreadystatechange 事件中再通知处理完成。 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { WebClient client = new WebClient(); client.DownloadStringCompleted += Client_DownloadStringCompleted; client.DownloadStringAsync(new Uri("http://www.baidu.com")); ; } private void Client