【问题标题】:Asynchronous computation always have to use a separate thread?异步计算总是要使用单独的线程?
【发布时间】:2013-12-08 10:17:20
【问题描述】:

异步操作必须在不同的线程中执行似乎是合乎逻辑的。也就是说,不涉及多线程就不能创建任何异步动作。毕竟,如果它不在不同的线程中执行,它会阻塞主线程,因此它不再是异步的。

但是,他们告诉我异步并不一定意味着涉及额外的线程。如果我没记错的话,他们说至少对于 javascript 来说是这样的。

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

【问题讨论】:

  • 线程允许异步计算,因为操作系统会调度它们,但其他调度机制也是可能的。例如,Go 使用 goroutine,它们是 go 运行时并发调度的轻量级“线程”(虽然不是操作系统意义上的)。

标签: multithreading asynchronous


【解决方案1】:

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

传统上,异步意味着它独立于“时钟”运行,同义词是“基于事件”的——异步只是意味着某事由事件触发。同步是常规的代码流,例如顺序读取一行接一行。

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

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

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

【讨论】:

  • 代码逐行执行,没有多线程怎么可能存在?
  • 查看event loops - 基本上您的代码可以在“监听”状态下空闲,当发生事件/中断时它可以执行代码。都是单线程的。
【解决方案2】:

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

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

负责执行此操作的人是调度程序或事件循环(参见绿色线程,它们是轻量级的,但在用户空间而不是由内核管理)。因此,我们的想法是编写一个调度程序来分配该线程本身的时间。

也许你熟悉python或node js?一些 web 框架,如 tornado 和 twisted,利用了由“事件循环”切换的单个线程:参见此处:http://krondo.com/?p=1209

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        相关资源
        最近更新 更多