首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >异步调用总是创建/调用新线程吗?

异步调用总是创建/调用新线程吗?
EN

Stack Overflow用户
提问于 2009-02-28 10:29:31
回答 6查看 10K关注 0票数 32

异步调用总是创建一个新线程吗?

示例:

如果JavaScript是单线程的,那么它如何进行异步回发呢?它是不是真的被阻塞了,直到它得到回调?如果是这样,这真的是一个异步调用吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-03-05 15:14:38

这是一个有趣的问题。

异步编程是一种编程范例,它主要是单线程的,即“遵循一个连续执行的线程”。

您提到的是javascript,所以让我们在web浏览器的环境中讨论一下该语言。web浏览器在每个窗口中运行javascript执行的单线程,它处理事件(如onclick="someFunction()")和网络连接(如xmlhttprequest调用)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
function performRequest() {
  xmlhttp.open("GET", "someurl", true);
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
      alert(xmlhttp.responseText);
    }
  }
  xmlhttp.send(sometext);
}
</script>
<span onclick="performRequest()">perform request</span>

(这是一个不起作用的示例,仅用于演示概念)。

为了以异步的方式做所有的事情,控制线程有一个所谓的“主循环”。主循环看起来像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (true) {
    event = nextEvent(all_event_sources);
    handler = findEventHandler(event);
    handler(event);
}

需要注意的是,这不是一个“忙循环”。这有点像休眠线程,等待活动发生。活动可以是来自用户的输入(鼠标移动、按钮单击、键入),也可以是网络活动(来自服务器的响应)。

所以在上面的例子中,

  1. 当用户单击跨度时,将生成一个ButtonClicked事件,findEventHandler()将在跨度标记上找到onclick事件,然后使用该事件调用该处理程序。
  2. 创建xmlhttp请求时,它将被添加到事件源的all_event_sources列表中。
  3. 在performRequest()函数返回后,主循环在nextEvent()步骤等待响应。此时,没有什么可以“阻止”进一步处理事件。

从远程服务器返回数据,nextEvent()返回网络事件,发现事件处理程序是onreadystatechange()方法,调用该方法,并启动

  1. ()对话框。

值得注意的是alert()是一个阻塞对话框。当该对话框打开时,不能再处理其他事件。这是网页的javascript模型的一个古怪之处,我们有一个现成的方法,可以在该页面的上下文中阻止进一步的执行。

票数 53
EN

Stack Overflow用户

发布于 2009-02-28 10:43:48

Javascript模型是单线程的。异步调用不是新线程,而是中断现有线程。它类似于内核中的中断。

是的,使用单个线程进行异步调用是有意义的。下面是如何思考这一点的:当你在单个线程中调用一个函数时,当前方法的状态被推送到一个堆栈上(即局部变量)。子例程被调用并最终返回,此时从堆栈中弹出原始状态。

使用异步回调,同样的事情也会发生!不同之处在于,子例程由系统调用,而不是由调用子例程的当前代码调用。

票数 17
EN

Stack Overflow用户

发布于 2009-03-06 22:29:11

关于JavaScript有几个特别的注意事项:

默认情况下,XMLHttpRequest是非阻塞的。在将请求中继到基础网络堆栈之后,send()方法立即返回。来自服务器的响应将安排在事件循环上调用您的回调,正如其他优秀答案所讨论的那样。

这不需要新的线程。底层socket API是可选择的,类似于Java语言中的java.nio.channels

可以通过将false作为第三个参数传递给open()来构造同步XMLHttpRequest对象。这将导致send()方法阻塞,直到收到来自服务器的响应,从而将事件循环置于网络延迟的支配之下,并可能使浏览器挂起,直到网络超时。这是一件坏事™。

Firefox3.5将通过Worker类引入真正的多线程JavaScript。后台代码在完全独立的环境中运行,并通过在事件循环上安排回调来与浏览器窗口通信。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/598436

复制
相关文章
junit方法按顺序执行
选定版本,直接加注解
IT云清
2021/12/06
1.3K0
junit方法按顺序执行
sql按顺序去重
参考博客: https://blog.csdn.net/qtvb1987/article/details/42081585
周杰伦本人
2022/10/25
8450
sql按顺序去重
数组按指定顺序排序
数组排序可以直接使用 sort() 方法,可以对数组按规律排序。 但如果指定一个没有规律的顺序进行排序呢? 同样可以使用  sort() 方法: const data = [   { name: '张三', code: 'zs' },   { name: '王五', code: 'ww' },   { name: '赵七', code: 'zq' }, ]; data.sort((star, next) => {   const sortList = ['zq', 'zs', 'ww']   return 
德顺
2022/06/12
2.7K0
实现线程按顺序输出ABC
线程按顺序输出ABC 实现描述:建立三个线程A、B、C,分别按照顺序输出十次ABC 首先建立一个方法,按照条件进行输出 class PrintABC{ private int index=0; public synchronized void print(int n) { // TODO Auto-generated method stub try { while(index!=n) { wait(); } if(index==0) { System.out.
呆呆
2021/10/06
7810
hive-行转列按顺序合并
目录 一、背景 二、实现 1.建表ddl 2.示例数据 3.按顺序合并 4.按顺序合并结果 5.可以看到最后一条最长的才是我们需要的数据 6.结果 ---- ---- 一、背景 想实现行转列按顺序合并,但是impala不支持,故用hive实现 二、实现 1.建表ddl create table a( id bigint comment '主键', type bigint comment '分类', start_time bigint comment '开始时间,时间戳', end_time big
chimchim
2022/11/13
2.1K0
hive-行转列按顺序合并
java | 如何让线程按顺序执行?
本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:
JavaFish
2019/10/16
6.6K0
JavaScript 将对象数组按字母顺序排序
1.if条件语句 + sort() 2.localeCompare() + sort() 3.Collator() + sort()
唐志远
2023/08/01
2610
JavaScript 将对象数组按字母顺序排序
让线程按顺序执行 8 种方法
本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:
业余草
2019/09/18
2K0
让线程按顺序执行 8 种方法
JavaScript 将对象数组按字母顺序排序
Chrome、IE、Edge、Firefox、Safari、Opera 等 都支持 sort() 方法。
唐志远
2023/07/26
6330
JavaScript 将对象数组按字母顺序排序
LeetCode 1389. 按既定顺序创建目标数组
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/create-target-array-in-the-given-order 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2022/11/26
4220
LeetCode 1389. 按既定顺序创建目标数组
让线程按顺序执行8种方法
1.早上;2.测试人员、产品经理、开发人员陆续的来公司上班;3.产品经理规划新需求;4.开发人员开发新需求功能;5.测试人员测试新功能。
java架构师
2019/04/09
1K0
RTL设计- 多时钟域按顺序复位释放
当外部输入的复位信号只有一个,但是时钟域有多个时,使用每个时钟搭建自己的复位同步器即可,如下所示。
FPGA开源工作室
2021/05/31
1.5K0
RTL设计- 多时钟域按顺序复位释放
LeetCode 1389. 按既定顺序创建目标数组
目标数组 target 最初为空。 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。 重复上一步,直到在 nums 和 index 中都没有要读取的元素。 请你返回目标数组。
freesan44
2020/06/16
4620
LeetCode 1389. 按既定顺序创建目标数组
1389. 按既定顺序创建目标数组: https://leetcode-cn.com/problems/create-target-array-in-the-given-order/
村雨遥
2020/04/07
6420
GoogleMaps api for javascript demo 动态按顺序加载marker
@{ } <!DOCTYPE html> <html lang="zh"> <head> <meta name="viewport" content="initi
阿新
2018/04/12
8040
Python按顺序读取文件夹中文件
涉及到文件操作,我们有时候会读取一个文件夹中的所有的文件。这些文件可能是文件名完全混乱的,也可能是完全格式化的(如1.png,2.png...)。下面介绍Python中的几种按顺序(假如有)读取文件夹中文件的方法。
狼啸风云
2020/08/27
9.9K0
Python按顺序读取文件夹中文件
按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
MickyInvQ
2021/12/07
4570
python 按顺序读文件夹下面的文件
方法一: import os path="/home/test/" #待读取的文件夹 path_list=os.listdir(path) path_list.sort() #对读取的路径进行排
狼啸风云
2020/08/10
2.5K0
python 按顺序读文件夹下面的文件
按之字形顺序打印二叉树
两个栈来实现; 定义一个放奇数层得栈,一个方偶数层得栈,和一个层奇偶标志, 遍历两个栈,每次消灭一个栈中得数据,添加在list中添加一层得数据 需要注意得是结合栈得先进后出性质,当我们遍历到奇数层时候,我们要从左到右得添加数据到栈二.同理偶数相反.
名字是乱打的
2022/12/13
2810
如何实现 DAX 按指定顺序拼接字符串
如果你正在学习 DAX,那么这又是一个非常好的案例可以帮助你理解 DAX 很多妙处。
BI佐罗
2021/12/01
1.5K0
如何实现 DAX 按指定顺序拼接字符串

相似问题

如何按顺序安排svg动画的时间?

13

按顺序安排任务

22

安排多个R脚本按顺序运行

10

Spyder如何安排python脚本按顺序运行

10

使用动画css按顺序动画元素

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文