2015-07-17 2 views
1

Я обнаружил реализация питон Goroutines, https://goless.readthedocs.org/en/latest/ и с игройПоймите goless.select из примера кода

Учитывая следующий код из документации:

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

попробуйте спать 2000 мс и 3000 мс в гортанах. Я думаю, результат будет два-> один. –

+0

синхронизация по времени не синхронизация. Я не знаю, почему это не работает, но вы не должны спать, чтобы попытаться установить случившееся раньше гарантии - это не детерминировано. – thwd

ответ

0

Поскольку нет никакого ответа, поэтому я пошел, чтобы рыть на репо проекта, нашел подобный вопрос здесь:

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

Наиболее заметным:

использованием time.sleep просто приостанавливает текущий поток. Он не выполняет никаких переключений между сопрограммами. Вам нужно будет использовать gevent.sleep или аналогичный механизм для Stackless (или goless.backend.yield).

Так что казалось, что я неправильно понял, что goless создаст разные темы, но я был неправ.

Смежные вопросы