2013-11-23 41 views
0

异步操作似乎必须在不同的线程中执行。也就是说,如果不涉及多线程,就不能创建异步操作。毕竟,如果它不在另一个线程中执行,它会阻塞主线程,因此它不再是异步的。异步计算总是必须使用单独的线程?

但是,他们告诉我,异步并不一定意味着涉及额外的线程。如果我记得正确,他们告诉它至少对于JavaScript来说是正确的。

所以我的问题是:异步操作是否必须在不同的(不是主)线程中执行总是并且可以在没有多线程的情况下存在异步计算?

+0

线程允许异步计算,因为OS调度它们,但其他调度机制也是可能的。例如,Go使用goroutine,这是轻量级的“线程”(尽管不在OS意义上),即运行时运行时间同时进行调度。 – Alec

回答

3

您还没有真正在这里指定语言/技术。

异步传统意味着它独立于“时钟”运行同义词是“基于事件” - 异步意味着事件被触发。同步是正常的代码流,就像依次读取一行一行一样。

异步函数可以发生在任何线程中,你似乎比较苹果和橙子。

想象一个分支来监视中断的线程,如果发生中断,监视线程将被异步使用。这是一个奇怪的问题,但答案是“不,异步活动可以发生在任何线程”

是的,它可以存在没有多线程。

+0

如果代码一行一行地执行,它如何在没有多线程的情况下存在? –

+0

查看“事件循环” - 基本上,您的代码可以处于“侦听”状态,当发生事件/中断时,它可以执行代码。所有单线程。 – FaddishWorm

1

您可以拥有一个操作系统线程,但可以使用多个绿色线程(在用户空间中管理的线程)执行异步操作。与此相关的一个上下文是IO绑定应用程序,例如Web应用程序打击数据库。一般来说,这是由连接到数据库的网络绑定的IO。

假设我们只有一个控制线程。如果请求是同步发生的,那么一次只发生一个请求,因为我们在转移到下一个请求之前等待套接字向我们返回数据包。现在你可以意识到大部分时间都花在了回复上,所以把这个工人放在一个“等待队列”(使用select或epoll或你有什么),并让别人得到处理和等待。

负责这样做的人是调度程序或事件循环(参见绿色线程以及轻量级但在用户空间而不是由内核管理)。所以我们的想法是编写一个调度程序,将时间分配给一个线程本身。

也许你对python或node js很熟悉?一些像龙卷风和扭曲的web框架利用了一个可以通过“事件循环”切换的单个线程:请参阅:http://krondo.com/?p=1209

1

异步性和多线程是不同的概念,虽然经常混淆。为了支持异步性,一个线程就足够了,它可以成为主线程,但切换到异步模式。多线程的异步性是可能的,但更复杂且容易出错。因此,典型的决定是为异步性分配一个单独的线程,就像在所有GUI框架中完成的那样,包括swing/awt。

0

这取决于需求,但最好是为异步计算分离线程。 E.g在http应用程序中,如果主线程正在等待其他服务器的响应,并且在接收到响应后不做任何事情,最好为此启动一个新线程,让主线程完成它的工作并释放所有获取的资源通过它。它会提高性能并减少堆的使用量。