在调用系统调用时,其他goroutine如何继续执行?(当使用GOMAXPROCS = 1时)
据我所知,在调用系统调用时,线程会放弃控制,直到系统调用返回为止.Go如何在不使用block-on-syscall goroutine创建系统线程的情况下实现这种并发性?
从文档:
够程
它们被称为goroutines,因为现有的术语 - 线程,协同程序,进程等 - 传达了不准确的内涵.goroutine有一个简单的模型:它是一个与同一地址空间中的其他goroutine同时执行的函数.它是轻量级的,比堆栈空间的分配花费更多.并且堆栈开始很小,因此它们很便宜,并且通过根据需要分配(和释放)堆存储来增长.
Goroutines被多路复用到多个OS线程上,因此如果应该阻塞,例如在等待I/O时,其他线程继续运行.他们的设计隐藏了线程创建和管理的许多复杂性.
我有一个流式备份脚本,我正在运行如下:
./backup_script.sh | aws s3 cp - s3://bucket/path/to/backup
Run Code Online (Sandbox Code Playgroud)
该aws命令以原子方式将stdin流式传输到云存储.如果在没有EOF的情况下中断进程,则上载将中止.
aws如果./backup_script.sh使用非零退出代码退出,我希望该进程被终止.
这样做的任何bash技巧?
编辑:您可以使用此脚本测试您的解决方案:
#!/usr/bin/env python
import signal
import sys
import functools
def signal_handler(signame, signum, frame):
print "Got {}".format(signame)
sys.exit(0)
signal.signal(signal.SIGTERM, functools.partial(signal_handler, 'TERM'))
signal.signal(signal.SIGINT, functools.partial(signal_handler, 'INT'))
for i in sys.stdin:
pass
print "Got EOF"
Run Code Online (Sandbox Code Playgroud)
例:
$ grep --bla | ./sigoreof.py
grep: unrecognized option `--bla'
usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
[-e pattern] [-f file] [--binary-files=value] [--color=when]
[--context[=num]] [--directories=action] [--label] [--line-buffered]
[--null] [pattern] [file ...]
Got …Run Code Online (Sandbox Code Playgroud) 我有以下代码
r, w = os.pipe()
rf, wf = os.fdopen(r, 'rb', 0), os.fdopen(w, 'wb', 0)
wf.write('hello')
Run Code Online (Sandbox Code Playgroud)
当阅读它时
rf.read(10)
Run Code Online (Sandbox Code Playgroud)
它永远阻塞。但是,如果我正在阅读它
os.read(r, 10)
Run Code Online (Sandbox Code Playgroud)
它'hello'不等待 10 个字节可用就返回。
问题是:如何使.read()' os.fdopen()ed 文件对象表现相同?(又名非阻塞)
这段代码在Ruby 2.1上破解了
class Test
def to_s()
"hi"
end
end
puts [Test.new(), Test.new()].to_s
Run Code Online (Sandbox Code Playgroud)
Ruby 1.9.3:
$ ruby --version
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
$ /opt/chef/embedded/bin/ruby test.rb
[hi, hi]
Run Code Online (Sandbox Code Playgroud)
Ruby 2.1:
$ ruby --version
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-linux]
$ ruby test.rb
[#<Test:0x000000022ac400>, #<Test:0x000000022ac3d8>]
Run Code Online (Sandbox Code Playgroud)
这是在某处记录的吗?如何保留旧的行为?
PIP最近(昨天)从1.5.6升级到6.0.1.它打破了我的一些东西.我正在寻找一种方法来使"get-pip.py"脚本安装1.5.6而不是最新版本.
有任何想法吗?