单线程异步处理

2024-03-24

即使读完之后http://krondo.com/?p=1209 http://krondo.com/?p=1209 or 异步调用是否总是创建/调用新线程? https://stackoverflow.com/questions/598436/does-an-asynchronous-call-always-create-call-a-new-thread我仍然对如何在固有的单线程系统上提供异步调用感到困惑。我将解释到目前为止我的理解并指出我的疑问。

我读到的例子之一是描述一个提供异步处理请求的 TCP 服务器 - 用户会调用一个方法,例如get(Callback c)并且回调将在一段时间后被调用。现在,我的第一个问题是 - 我们已经有两个系统,一个服务器和一个客户端。这不是我的意思,因为事实上我们至少有两个线程 - 一个在服务器,一个在客户端。

我读到的另一个例子是 JavaScript,因为这是单线程异步系统最突出的例子Node.js。我无法理解的,也许用 Java 术语来说,是这样的:如果我执行下面的代码(对不正确的、可能是糟糕的语法表示歉意):

function foo(){
    read_file(FIle location, Callback c) //asynchronous call, does not block
    //do many things more here, potentially for hours
}

对读取文件的调用执行(某物)并返回,从而允许执行我的函数的其余部分。由于只有一个线程,即正在执行我的函数的线程,那么同一个线程(唯一一个正在执行我的东西的线程)究竟如何从磁盘读取字节?

基本上,在我看来,我缺少一些底层机制,它的作用类似于某种循环调度程序,它本质上是单线程的,可能会将任务分割成更小的任务,或者调用一个多线程组件,该组件会生成一个线程并读入文件。

预先感谢所有评论并指出我的错误。

Update: 谢谢大家的回复。帮助我解决这个问题的更多好资源在这里:

  1. http://www.html5rocks.com/en/tutorials/async/deferred/ http://www.html5rocks.com/en/tutorials/async/deferred/
  2. http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchronous/ http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchrounous/
  3. http://www.interact-sw.co.uk/iangblog/2004/09/23/threadless http://www.interact-sw.co.uk/iangblog/2004/09/23/threadless (.NET)
  4. http://ejohn.org/blog/how-javascript-timers-work/ http://ejohn.org/blog/how-javascript-timers-work/(定时器的本质)
  5. http://www.mobl-lang.org/283/reducing-the-pain-synchronous-asynchronous-programming/ http://www.mobl-lang.org/283/reducing-the-pain-synchronous-asynchronous-programming/

真正的答案是,这取决于“单线程”的含义。

多任务处理有两种方法:协作式和中断驱动式。合作,也就是您引用的另一个 StackOverflow 项目所描述的,要求例程显式放弃处理器的所有权,以便它可以执行其他操作。事件驱动系统通常是这样设计的。优点是它更容易管理,并且避免了数据访问冲突的大部分风险,因为在任何时候只有一小块代码被执行。缺点是,因为一次只做一件事,所以所有事情都必须设计得相当快地执行,或者分成多个块(通过像yield()调用),否则系统将出现冻结状态,直到该事件被完全处理为止。

另一种方法——线程或进程——主动让处理器停止运行代码块,在完成其他事情时暂停它们。这实现起来要复杂得多,并且在编码时需要更加小心,因为您现在面临同时访问共享数据结构的风险,但它更强大,而且(如果做得正确)更加健壮和响应迅速。

是的,这两种情况确实都涉及一个调度程序。在以前的版本中,调度程序只是旋转,直到事件到达(从操作系统和/或运行时环境传递,这隐式是另一个线程或进程),并在处理下一个到达的事件之前调度该事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单线程异步处理 的相关文章

  • 非法使用break语句; javascript

    当这个变量达到一定数量时 我希望循环停止 但我不断收到错误 未捕获的语法错误 非法的中断语句 function loop if isPlaying jet1 draw drawAllEnemies requestAnimFrame loop
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • 正确签名的 JNLP 应用程序无法在 Java 7 中运行

    我有一个 JNLP 应用程序 由于证书过期需要更新 我有一个经过 CA 验证的新证书 我已将新证书导入到我的密钥库中 我已导入完整的证书链 我的构建文件对构建中的 jar 进行签名和时间戳
  • Socket IO 服务器到服务器

    服务器是否可以使用 Socket IO 连接到另一个服务器并被视为客户端 并让它加入房间 接收 io sockets in lobby emit 和更多 第一个服务器也在监听连接 消息 嘿 Brad 下面是我的完整 js 应用程序 供参考
  • JSONP 使用 JQuery 从 HTTPS 协议获取 JSON

    我正在尝试获取从 https 安全站点发送的 JSON 客户端希望不要使用任何服务器端语言 全部都是 Javascript 我读到 当使用 Jquery 中的 ajax 函数时 我必须使用 JSONP 才能从安全站点加载 JSON 我的第一
  • 嵌套 DIV 的类似斑马的 CSS 样式

    我嵌套了 DIV 元素 但我不知道嵌套的级别 我需要每个都有与其父级不同的背景 创建类似斑马的颜色 我只使用两种背景 深色和白色 效果需要类似于在容器中设置奇数和偶数子级的样式 但在我的例子中 子级是嵌套的 我可以使用每个嵌套元素的规则来做
  • 在 java 中运行外部应用程序但不要等待它完成

    我正在用java编写一个应用程序 允许我运行其他应用程序 为此 我使用了 Process 类对象 但当我这样做时 应用程序会等待进程结束 然后再退出 有没有办法在 Java 中运行外部应用程序 但不等待它完成 public static v
  • 如何从intellij项目视图中隐藏不必要的文件?

    给定一个示例 gradle 项目 其项目结构如下所示 正如你所看到的 有很多东西你实际上不需要在想法中看到 但你需要它们存在 我知道下面被忽略的文件 文件夹类型Editor File Types但这些正在影响库和项目 idea 会在各处忽略
  • Java 中 JButton 的击键/热键

    最初我使用 JMenu 并建立热键以使用加速器工作 它运行得很好 现在我想在 JButton 中实现相同的行为 但我陷入困境 这是我编写的代码 请分享您的想法 以便我可以走上正确的道路 import javax swing import j
  • jQuery 中什么函数相当于 .SelectMany()?

    让我解释一下 我们知道 jQuery 中的映射函数充当 Select 如 LINQ 中 tr map function return this children first returns 20 tds 现在的问题是我们如何在 jQuery
  • javax.media.jai 类的公共下载?

    这是一个非常简单的问题 我一直在寻找可以下载 javax media jai 库的地方 我找到了 jai imageio 库 但是我发现的所有其他 jai 内容要么已经过时 2008 年及之前 然后我遇到了登录屏幕 是否有 javax me
  • Perl Parallel::Forkmanager 不允许收集变量值

    也许因为子进程不知道我的散列 请参阅下面的代码 散列 输出没有收集任何内容 除了写入 tmp 文件之外 还有其他方法来收集该值吗 foreach Item AllItems pid pm gt start Item and next Tem
  • 标记(Markdown)+ Mermaid(流程图和图表)

    努力去争取 美人鱼 https github com knsv mermaid https github com knsv mermaid跟 共事 标记 https github com chjj marked https github c
  • java.lang.IllegalStateException - 提交响应后无法创建会话

    我在我的项目中使用 JSF PrimeFaces 我为此准备了一个Maven项目 当我编译项目并加载主页后 我收到以下异常 java lang IllegalStateException Cannot create a session af
  • 使用 File API polyfill 读取数据 URL

    我正在尝试使用文件 API 库 https github com mailru FileAPI https github com mailru FileAPI 作为不支持文件 API 的浏览器的后备 以便将文件作为数据 URL 读取并将其传
  • 在实现使用原始类型的接口时如何避免警告?

    我正在实施流程工厂 http help eclipse org ganymede index jsp topic org eclipse platform doc isv reference api org eclipse debug co
  • 如何建立与 FileZilla Server 1.2.0 的 FTPS 数据连接

    使用 Apache commons net 的 Java FTPSClient 进行会话恢复是一个已知问题 会话恢复是 FTPS 服务器数据连接所需的一项安全功能 Apache FTPSClient 不支持会话恢复 并且 JDK API 使
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr
  • $ 在 JQuery 中意味着什么

    在下面的 var obj one 1 two 2 three 3 four 4 five 5 each obj function i val console log val 这里是什么意思 是对象吗 是一个别名jQuery对象 函数 它充当
  • 如何通过点击复制 folium 地图上的标记位置?

    I am able to print the location of a given marker on the map using folium plugins MousePosition class GeoMap def update

随机推荐

  • GORM GOLANG/Go msSQL UNIQUEIDENTIFIER 结构内部

    你好 我有像这里名为 person 的结构 当我调用我的休息端点并从 mssql 数据库获取数据时 其中 ID 是 ID 唯一标识符 默认 NEWSEQUENTIALID package entities import mssql gith
  • 8-10 年后恢复 Java 开发速度

    我上一次认真进行 Java 编码是在世纪之交的时候 与此同时 我做了很多其他的事情 最近是 c 嵌入式的东西 和 c 几个月后我将开始一项新任务 而且很可能一直都是 Java 除了我将与 JBoss 处理某些应用程序之外 我没有太多信息 所
  • 为什么“poly”抱怨度数小于唯一点的数量?

    我正在尝试在 R 中生成正交多项式 但我不断收到一个我不明白的错误 gt poly 1 1000 50 Error in poly 1 1000 50 degree must be less than number of unique po
  • 如何在JPA的BaseEntity中实现equals()和hashcode()方法?

    我有一个BaseEntity类是我的应用程序中所有 JPA 实体的超类 MappedSuperclass public abstract class BaseEntity implements Serializable private st
  • 如何隐藏使用 Electron 构建的 NodeJS 解决方案的源代码(asar 文件)? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我寻找隐藏使用 Electron 构建的解决方案代码的最佳方法 有任何想法吗 使用 Electron 构建解决方案asar 文件不够
  • 如何让BMP填充JPanel

    如何让BMP填满JPanel import java awt Dimension import java awt Graphics import java awt Graphics2D import java awt Image impor
  • 在 Angular 中使用 fxLayoutGap 时,每行最后一个元素的填充问题

    我目前面临一个大问题https www npmjs com package angular flex layout https www npmjs com package angular flex layout图书馆 问题是fxLayout
  • 生成随机日期

    如何生成特定日期范围内的一组 12 个随机日期 我认为以下方法会起作用 sample as Date 1999 01 01 as Date 2000 01 01 12 但结果看起来像是一组随机数字 谢谢 seq有一个类方法Date适用于此
  • LINQ to SQL:并发解析

    鉴于此 LINQ to SQL using var db Database Context var root from post in db Post where post Id rootPostId select post Single
  • Haskell 将 Hom Functor/Monad 称为什么?

    我想在我的代码中使用它 并且不想重复它 但由于它只涉及大量通用单词 如 函数 或 组合 我无法通过搜索找到它 完全具体地说 我正在寻找 instance Functor x gt where fmap f p f p 这是基本的读取器 或环
  • 在 Java Swing 中播放视频

    我正在做一个关于视频隐写术的项目 我想到在Java Swing中播放这2个视频文件 以便更容易地比较文件 所以我想知道我们是否可以在 Swing 中播放视频 请帮帮我 您可能想看看Java媒体框架 http www oracle com t
  • 在 django 中获取相关值而不出现DoesNotExist 错误的最佳实践

    如果我在 Django 中有两个模型 class Blog models Model author models CharField class Post models Model blog models ForeignKey Blog 我
  • AJAX 不处理 302 重定向

    我在外部服务器上有一个数据库 我正在尝试查询该数据库 为此 我将在本地服务器 Tomcat 上创建一个 AJAX 调用 只是 XMLHttpRequest 对象 我没有使用任何 JavaScript 库 到附加了查询的页面 将完全相同的 U
  • 如何将数据从 Windows 窗体保存到 XML 文件?

    我非常确定我必须首先创建 XML 文件的某种模型 对吧 任何帮助将不胜感激 一种简单的方法是创建 NET 类 将数据放入其中然后使用Xml序列化器 http msdn microsoft com en us library system x
  • 在 Google 地图 v3 中绘制两点之间的路线时行为不一致

    场景 我试图在两者之间画一条路线n使用 Google 地图 v3 的点 纬度 局域网 为此 我正在使用DirectionsService它为我提供了一条路线 然后我将该坐标推入MVCArray然后使用 a 绘制该路径Polyline The
  • 饮食例外

    我正在解析一个不时包含格式错误的数据的文件 它抛出一个异常 我想从异常中恢复并忽略格式错误的数据 最好的方法是什么 try parse file catch Exception eat it EDIT 我认为 我的问题没有被很好地理解 我想
  • 如何在Flutter中将CameraController的XFile转换为Image类型?

    扑动的CameraController has a takePicture 从相机拍照的方法 给出了类型Future
  • 有没有办法不用每次验证就使用Google Api?

    我尝试在 PC 上的自动运行中使用 python 上的 API 但我不能 因为每次程序启动时 它都会询问我授权码 这是我的代码 client secret file client secret json flow google auth o
  • postgresql 分区上的唯一索引

    我有一个名为 cdrs 的表 CREATE TABLE cdrs i cdr bigint NOT NULL i cdrs connection bigint NOT NULL i call bigint NOT NULL customer
  • 单线程异步处理

    即使读完之后http krondo com p 1209 http krondo com p 1209 or 异步调用是否总是创建 调用新线程 https stackoverflow com questions 598436 does an