英文:
Understand goless.select from the sample code
问题
我发现了Goroutines的Python实现,链接为https://goless.readthedocs.org/en/latest/,并进行了尝试。
给定以下来自文档的代码:
c1 = goless.chan()
c2 = goless.chan()
def func1():
time.sleep(1)
c1.send('one')
goless.go(func1)
def func2():
time.sleep(2)
c2.send('two')
goless.go(func2)
for i in range(2):
case, val = goless.select([goless.rcase(c1), goless.rcase(c2)])
print(val)
它打印出:
one
two
关于select
方法的文档:
> 选择第一个准备好的case。如果存在默认case(goless.dcase),则在没有其他case准备好时返回默认case。如果没有默认case且没有case准备好,则阻塞直到有case准备好。
所以我将sleep(1)
更改为sleep(3)
,如下所示:
c1 = goless.chan()
c2 = goless.chan()
def func1():
time.sleep(3)
c1.send('one')
goless.go(func1)
def func2():
time.sleep(2)
c2.send('two')
goless.go(func2)
for i in range(2):
case, val = goless.select([goless.rcase(c1), goless.rcase(c2)])
print(val)
我以为它会打印:
two
one
但实际上打印出:
one
two
为什么会这样呢?
英文:
I have discovered python implementation of Goroutines, https://goless.readthedocs.org/en/latest/ and having a play
Given the following code from the documentation:
c1 = goless.chan()
c2 = goless.chan()
def func1():
time.sleep(1)
c1.send('one')
goless.go(func1)
def func2():
time.sleep(2)
c2.send('two')
goless.go(func2)
for i in range(2):
case, val = goless.select([goless.rcase(c1), goless.rcase(c2)])
print(val)
And it prints:
one
two
Documentation about the select
method
> Select the first case that becomes ready. If a default case
> (goless.dcase) is present, return that if no other cases are ready. If
> there is no default case and no case is ready, block until one becomes
> ready.
So I went ahead and change the sleep(1)
to sleep(3)
as below:
c1 = goless.chan()
c2 = goless.chan()
def func1():
time.sleep(3)
c1.send('one')
goless.go(func1)
def func2():
time.sleep(2)
c2.send('two')
goless.go(func2)
for i in range(2):
case, val = goless.select([goless.rcase(c1), goless.rcase(c2)])
print(val)
And I thought it would print:
two
one
But it printed:
one
two
Why is that?
答案1
得分: 0
由于没有答案,我去查看了项目存储库,并在这里找到了一个类似的问题:
https://github.com/rgalanakis/goless/issues/42
最值得注意的是:
> 使用time.sleep只会暂停当前线程,它不会在协程之间进行切换。您需要使用gevent.sleep或类似的机制来进行Stackless的切换(或者goless.backend.yield)。
所以看起来我误解了goless会创建不同的线程,但我错了。
英文:
Since there is no answer so I went to have a dig on the project repo, found a similar question here:
https://github.com/rgalanakis/goless/issues/42
Most notable:
> using time.sleep just pauses the current thread. It does not do any switching between coroutines. You would have to use gevent.sleep or a similar mechanism for Stackless (or goless.backend.yield).
So it seemed that I misunderstood the goless would create different threads but I was wrong.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论