我发现了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
为什么?
答案 0 :(得分:0)
由于没有答案所以我去挖掘项目回购,在这里找到了类似的问题:
https://github.com/rgalanakis/goless/issues/42
最值得注意的是:
使用time.sleep只是暂停当前线程。它不会在协同程序之间进行任何切换。你必须使用gevent.sleep或类似的Stackless(或goless.backend.yield)机制。
所以我似乎误解了无知者会创造出不同的线索,但我错了。