似乎逻辑上必须在不同的线程中执行异步操作。也就是说,如果不涉及多线程,就不能创建异步操作。毕竟,如果它没有在不同的线程中执行,它将阻塞主线程,因此它不再是异步的。
然而,他们告诉我异步并不一定意味着涉及额外的线程。如果我没记错的话,他们告诉至少对于javascript来说这是真的。
所以我的问题是:异步操作是否必须在不同的(非主要)线程总是中执行,并且可以在没有多线程的情况下存在异步计算(它是一个单独的线程)?
答案 0 :(得分:3)
你这里没有真正指定语言/技术。
异步传统意味着它独立于“时钟”运行同义词是“基于事件的” - 异步只意味着某事件是从事件触发的。同步是常规代码流,就像顺序读取一行一样。
异步功能可以在任何线程中发生,您正在比较苹果和橙子。
考虑分叉监视中断的线程,如果发生中断,监视线程将异步使用。这是一个奇怪的问题,但答案是“不,异步活动可以在任何线程中发生”
是的,没有多线程就可以存在。
答案 1 :(得分:1)
您可以拥有一个操作系统线程但使用多个绿色线程(在用户空间中管理的线程)执行异步操作。与此相关的一个上下文是IO绑定应用程序,例如命中数据库的Web应用程序。通常,这是由连接到数据库的网络绑定的IO。
假设我们只有一个控制线程。如果请求是同步的,那么一次只发生一个请求,因为我们等待套接字在转移到下一个请求之前将数据包返回给我们。现在你可以意识到大部分时间都花在了响应上,所以把这个工作者放在一个等待队列中#34; (使用select或epoll或你有什么),让其他人得到处理并等待。
负责这样做的人是调度程序或事件循环(参见绿色线程,它们重量轻但在用户空间而不是内核中管理)。因此,我们的想法是编写一个调度程序来分配一个线程本身的时间。
也许您熟悉python或节点js?一些像龙卷风和扭曲的网络框架利用了一个单一的线程,它被一个"事件循环切换了#34;:见这里:http://krondo.com/?p=1209。
答案 2 :(得分:1)
异步性和多线程是不同的概念,尽管经常混淆。为了支持异步性,一个线程就足够了,它可以是主线程,但是切换到异步模式。多线程上的异步性是可能的,但更复杂且容易出错。因此,典型的决定是为异步性专用一个单独的线程,就像在所有GUI框架中完成一样,包括swing / awt。
答案 3 :(得分:0)
这取决于要求,但是为异步计算分离线程会更好。例如,在http应用程序中,如果主线程正在等待来自其他服务器的响应并且在收到它之后不会做任何事情,那么最好为此启动一个新线程,让主线程完成它的工作和释放它获得的所有资源。它还可以提高性能并减少堆使用量。