从示例代码中了解goless.select

时间:2015-07-17 01:59:07

标签: python go

我发现了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方法

的文档
  

选择准备就绪的第一个案例。如果是默认情况   (goless.dcase)存在,如果没有其他情况准备就返回。如果   没有默认情况,没有案例准备好,阻止直到一个成为   准备好了。

所以我继续将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

为什么?

1 个答案:

答案 0 :(得分:0)

由于没有答案所以我去挖掘项目回购,在这里找到了类似的问题:

https://github.com/rgalanakis/goless/issues/42

最值得注意的是:

  

使用time.sleep只是暂停当前线程。它不会在协同程序之间进行任何切换。你必须使用gevent.sleep或类似的Stackless(或goless.backend.yield)机制。

所以我似乎误解了无知者会创造出不同的线索,但我错了。