在写 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 的某些东西,所以多了一个线程吧。一时兴起,也不知道怎么搜索关键词,也不想深究了。
1
billlee 2020-06-10 22:50:38 +08:00
试了一下,mingw64 的 bash 线程数是 8, linux 的 bash 是 1 线程
另外,POSIX 下处理信号并不需要线程 |
2
msg7086 2020-06-11 10:19:56 +08:00
信号类似中断,由操作系统直接改变你代码的运行流程。
比如你的程序在执行 calc()运算,然后又有一个信号处理程序 signal_handler()。 你程序运行的时候,执行位置当然在 calc()里,但是如果这时候你按下 Ctrl-C,就会触发一个 SIGINT 信号给进程,操作系统会直接停下这个线程,保存上下文环境,然后让当前程序从 signal_handler()开始执行,执行完退出函数后,再回到 calc()里停下的地方继续执行。 如果没有信号处理函数,就执行默认的处理函数,Ctrl-C 对应的默认处理函数当然就是退出程序了。 所以中断不需要多线程。 Windows 下不太一样,但是原理是类似的。 |
3
smallpython 2020-06-15 17:01:09 +08:00
while True:
try: test() time.sleep(60) except: pass 这样写的话 ctrl+c 停不下来, 只有 kill -9 |