协程概念里的 yield,翻译成中文,最合适的解释是什么?

2018-04-13 11:01:47 +08:00
 zlel

词典对 yield 的解释有:屈服;出产,产生;放弃。 我怎么感觉这几个意思放在 yield 的用法上都说的通,最准确的解释是哪种?

13814 次点击
所在节点    Python
102 条回复
kaedea
2018-04-13 13:45:24 +08:00
认怂
CSM
2018-04-13 13:51:45 +08:00
产出
安道翻译的《流畅的 Python 》中如是翻译 yield

只要和 return 的翻译区别开就行啦
hheedat
2018-04-13 13:56:00 +08:00
景甜
luoway
2018-04-13 13:57:01 +08:00
看例句
yield the floor to sb 让插嘴
yield the right way to sb/sth 让行
JamesRuan
2018-04-13 14:16:04 +08:00
出让
xcatliu
2018-04-13 14:17:29 +08:00
丫得
Rufeer
2018-04-13 14:19:04 +08:00
刚好看到,《 Python 核心编程》里面是这样写的:
线程包括开始、执行顺序和结束三部分。它有一个指令指针,用于记录当前运行的上下 文。当其他线程运行时,它可以被抢占(中断)和临时挂起(也称为睡眠)——这种做法叫 做让步(yielding)。
geelaw
2018-04-13 14:23:11 +08:00
“让出”

This is the same “ yield ” as in that a thread (voluntarily) yields (the CPU).
pigzilla
2018-04-13 14:24:39 +08:00
协程( coroutine )的协( co )是协作( cooperative )的意思,与之相对的是抢占式( preemptive )。

抢占式,就是轮到我执行了,现在执行的代码会被强制保存上下文然后暂停执行,换我执行。然而风水轮流转,我也会被这么抢占。抢占的过程通常是 OS 管理的,所以有可能抢占的时机并不是很合适因为 OS 不知道你每个线程现在在做啥合不合适暂停,但好在可以保证所有代码都能得到执行。

协作式,就是我执行过程中,到了一个阶段发现没事可做了(通常是等待 IO ),这时候 yield,主动把 CPU 资源让出来让别的代码去执行。同样的,别的代码也可能会在合适的时机主动暂停执行,让我再回来继续执行,如果我需要的其它资源已经到位( IO 数据已经有了)。协程的好处是这个让出的时机是开发时在代码里面明确写清楚了的( yield 关键字),所以让出的时机可以更合理。

yield 带来两个主要结果:1 )主动暂停代码的执行,让渡自己的资源占用; 2 )已经执行的代码可能产出一个中间成果。而事实上 yield 这个词在英文的本意就正好带有这两个含义。

因为谈到协程通常是和抢占式的多线程相比,也就是更注重第一个含义 /结果,所以 yield 在协程这个概念里面的最好翻译是“让出”。当然最好是不翻译,直接用 yield。

说 yield 类似于 return 的,只看到了 yield 的第二个结果,忽略了第一个。
paparika
2018-04-13 14:28:33 +08:00
让渡+1 说生产产出的不知道咋想的
yoloppp
2018-04-13 14:38:44 +08:00
甩锅
scriptB0y
2018-04-13 14:48:19 +08:00
呐喊
we3613040
2018-04-13 15:48:07 +08:00
@pigzilla 厉害,豁然开朗
qiyuey
2018-04-13 15:49:09 +08:00
我想到了 [套接字]
zhwithsweet
2018-04-13 15:57:33 +08:00
不如叫 乐不思蜀 吧
weizhen199
2018-04-13 16:31:27 +08:00
回避,全部回避!
winglight2016
2018-04-13 16:34:49 +08:00
关键字还是不要翻的好,记得以前 UML 里 usecase 被翻译成用况,被人骂死~~~
heiher
2018-04-13 16:56:40 +08:00
滚蛋
kaedea
2018-04-13 17:23:56 +08:00
为了表现的友好一点:禅位
mengzhuo
2018-04-13 18:15:05 +08:00
@pigzilla #49 还可以补充一下,一些 Python 第三方库,例如 gevent,或者 Go 语言层面都消除了 yield,但背后仍然是协作式的调度。

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

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

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

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

© 2021 V2EX