脚本解释器启动时有多少线程?

2020-06-10 22:20:47 +08:00
 crella

在写 ruby 写多线程脚本的时候,突发奇想:就算是只在主线程里执行某个用时很长的函数,当按下 Ctrl+C 的时候会显示 Interrupt,那这个 Interrupt 是如何捕捉的呢?所以有了以下测试。

用例:Python(win64 、mingw64)、Ruby(win64 、mingw64)、Perl(mingw64),系统是普通 Win7 64 位。用资源管理器(resmon)来查看程序用到的线程数

Python win64: 2 线程

Python 的示例代码里一种用了 sleep,一种用了需时较长的函数(要有足够的时间,资源管理器上才会显示进程的信息),结果程序的线程数是一样的,说明 sleep 应该也是单线程函数。

Python mingw64: 1 线程

Ruby win64: 2 线程

Ruby mingw64: 3 线程???

Perl mingw64: 2 线程

(Strawberry perl 下载慢,ActiveState perl 安装又慢,感觉不测试也没事)

不知道 lua 简单的 sleep 语句怎么写,放弃。

结果还是有点出乎意料的。我猜测 win 原生的解释器应该是加了 posix 的某些东西,所以多了一个线程吧。一时兴起,也不知道怎么搜索关键词,也不想深究了。

1992 次点击
所在节点    奇思妙想
3 条回复
billlee
2020-06-10 22:50:38 +08:00
试了一下,mingw64 的 bash 线程数是 8, linux 的 bash 是 1 线程

另外,POSIX 下处理信号并不需要线程
msg7086
2020-06-11 10:19:56 +08:00
信号类似中断,由操作系统直接改变你代码的运行流程。
比如你的程序在执行 calc()运算,然后又有一个信号处理程序 signal_handler()。
你程序运行的时候,执行位置当然在 calc()里,但是如果这时候你按下 Ctrl-C,就会触发一个 SIGINT 信号给进程,操作系统会直接停下这个线程,保存上下文环境,然后让当前程序从 signal_handler()开始执行,执行完退出函数后,再回到 calc()里停下的地方继续执行。
如果没有信号处理函数,就执行默认的处理函数,Ctrl-C 对应的默认处理函数当然就是退出程序了。

所以中断不需要多线程。

Windows 下不太一样,但是原理是类似的。
smallpython
2020-06-15 17:01:09 +08:00
while True:
try:
test()
time.sleep(60)
except:
pass

这样写的话 ctrl+c 停不下来, 只有 kill -9

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/680486

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX