当前位置:  开发笔记 > 编程语言 > 正文

异步与多线程 - 有区别吗?

如何解决《异步与多线程-有区别吗?》经验,为你挑选了8个好方法。

异步调用是否始终创建新线程?两者有什么区别?

异步调用是始终创建还是使用新线程?

维基百科说:

在计算机编程中,异步事件是独立于主程序流发生的事件.异步操作是在非阻塞方案中执行的操作,允许主程序流继续处理.

我知道异步调用可以在单线程上完成吗?这怎么可能?



1> karunski..:

每当需要异步发生的操作不需要CPU工作时,可以在不产生另一个线程的情况下完成该操作.例如,如果异步操作是I/O,则CPU不必等待I/O完成.它只需要启动操作,然后在I/O硬件(磁盘控制器,网络接口等)执行I/O工作时继续进行其他工作.硬件通过中断CPU让CPU知道它何时完成,然后操作系统将事件传递给您的应用程序.

通常,更高级别的抽象和API不会暴露从OS和底层硬件可用的底层异步API.在这些情况下,创建线程以执行异步操作通常更容易,即使生成的线程只是在等待I/O操作.

如果异步操作需要CPU执行工作,那么通常该操作必须在另一个线程中发生,以使其真正异步.即便如此,如果有多个执行单元,它实际上只是异步.



2> Michael Kohn..:

这个问题非常普遍,无法回答.

在一般情况下,异步调用不一定会创建新线程.这是实现它的一种方式,预先存在的线程池或外部进程是其他方式.它在很大程度上取决于语言,对象模型(如果有的话)和运行时环境.

异步只是意味着调用线程不会等待响应,异步活动也不会在调用线程中发生.

除此之外,你需要更具体.


所以基本上我正确地说:多线程==使用多线程以便为处理器密集型任务提供处理优势,这些任务可以[理想]从多处理器中受益,以及异步情况下的好处.异步==一个执行它的过程,而调用该过程的状态不必等待它完成.(可能不一定使用多个线程来执行此操作 - 即.其他硬件组件可能会承担责任).
@KumarVaibhav - 最常见的例子是单个线程处理队列中的项目(例如,Windows消息队列).如果程序习惯于将项目发送到它自己的队列(常见模式),那么发送项目的代码位不会等待操作完成,而只是返回.主循环将在适当的时候处理该操作.
@Michael - 你能解释一下如何在单个线程中用一个例子进行异步编程吗?
代码的编写方式和执行方式之间可能存在差异.例如,在C#中,我可以有一个启动异步任务的方法,我的方法完全可以异步识别,并且可以执行其他操作而无需等待任务完成.但是,CLR还可以决定内联我的任务并同步执行它.

3> Jason Orendo..:

不,异步调用并不总是涉及线程.

它们通常会启动某种与呼叫者并行的操作.但是,该操作可能由另一个进程,操作系统,其他硬件(如磁盘控制器),网络上的其他计算机或人类处理.线程并不是并行完成任务的唯一方法.



4> 小智..:

多线程是指在同一进程中发生的多个操作.异步编程跨进程传播.例如,如果我的操作调用Web服务,则该线程不必等到Web服务返回.这里我们使用异步编程,它允许线程不等待另一台机器中的进程完成.当它开始从Web服务获得响应时,它可以中断主线程,表示Web服务已完成处理请求.现在主线程可以处理结果.



5> Otávio Décio..:

Windows在使用消息循环之前的非抢占时间(版本2.13,3.0,3.1等)总是进行异步处理,在支持真实线程之前.所以要回答你的问题,不,没有必要创建一个线程来执行异步处理.



6> George V. Re..:

JavaScript是单线程和异步的.例如,当您使用XmlHttpRequest时,您将为其提供一个回调函数,该函数将在响应返回时异步执行.

John Resig很好地解释了定时器如何在JavaScript中工作的相关问题.



7> Mike..:

异步调用甚至不需要在与调用调用的系统/设备相同的系统/设备上进行.因此,如果问题是,异步调用是否需要当前进程中的线程,答案是否定的.但是,必须在某处处理异步请求的执行线程.

执行线程是一个模糊的术语.在早期的Macintosh和Windows操作系统等合作任务系统中,执行线程可能只是使请求运行另一个堆栈,指令指针等的相同进程......但是,当人们通常谈论异步调用时,它们通常表示由另一个线程处理的调用,如果它是进程内(即在同一进程内),或者是另一个进程,如果它是进程间的.

注意,进程间(或进程间)通信(IPC)通常被概括为包括进程内通信,因为用于锁定和同步数据的技术通常是相同的,而不管执行的单独线程在哪个进程中运行.



8> dmckee..:

有些系统允许您利用回调中的某些设施利用内核中的并发性.对于一个相当模糊的实例,异步IO回调用于在Mac System 6-8的无抢占式多任务处理中实现非阻塞的互联网服务器.

这样,你"中的"有并发执行流你程序而不线程如此.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有