小编omr*_*umi的帖子

goroutines如何运作?(或:goroutines和OS线程关系)

在调用系统调用时,其他goroutine如何继续执行?(当使用GOMAXPROCS = 1时)
据我所知,在调用系统调用时,线程会放弃控制,直到系统调用返回为止.Go如何在不使用block-on-syscall goroutine创建系统线程的情况下实现这种并发性?

从文档:

够程

它们被称为goroutines,因为现有的术语 - 线程,协同程序,进程等 - 传达了不准确的内涵.goroutine有一个简单的模型:它是一个与同一地址空间中的其他goroutine同时执行的函数.它是轻量级的,比堆栈空间的分配花费更多.并且堆栈开始很小,因此它们很便宜,并且通过根据需要分配(和释放)堆存储来增长.

Goroutines被多路复用到多个OS线程上,因此如果应该阻塞,例如在等待I/O时,其他线程继续运行.他们的设计隐藏了线程创建和管理的许多复杂性.

concurrency go goroutine

55
推荐指数
5
解决办法
1万
查看次数

在失败时杀死管道中的下一个命令

我有一个流式备份脚本,我正在运行如下:

./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)

bash

7
推荐指数
1
解决办法
663
查看次数

从无缓冲的 os.fdopen() 文件对象读取的行为与 os.read() 不同

我有以下代码

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 文件对象表现相同?(又名非阻塞)

python file-descriptor

5
推荐指数
1
解决办法
2360
查看次数

Ruby 2.1中的数组#to_s打破了我的代码

这段代码在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)

这是在某处记录的吗?如何保留旧的行为?

ruby ruby-2.1.4

4
推荐指数
1
解决办法
109
查看次数

任何使get-pip.py安装特定pip版本的技巧?

PIP最近(昨天)从1.5.6升级到6.0.1.它打破了我的一些东西.我正在寻找一种方法来使"get-pip.py"脚本安装1.5.6而不是最新版本.

有任何想法吗?

python pip

4
推荐指数
3
解决办法
3353
查看次数

标签 统计

python ×2

bash ×1

concurrency ×1

file-descriptor ×1

go ×1

goroutine ×1

pip ×1

ruby ×1

ruby-2.1.4 ×1