2015-12-08 3 views
0

Существует множество способов создания волокна с витыми элементами Python. Например, можно было бы позвонить reactor.callWhenRunning(helloWorld). helloWorld() будет выполняться, и волокно прекратит выполнение, когда возвращается helloWorld().Остановить свернутое Fiber Mid-Execution

Что делать, если на половине пути выполнить helloWorld() Я хотел остановить выполнение волокна, не затрагивая остальные волокна? Как мне это сделать?

Если выполнение выполнено внутри helloWorld(), то я мог бы просто вернуться из метода. Но что, если программа содержит 10 вложенных вызовов? Как я могу остановить выполнение волокна? Я полагаю, что я мог бы немедленно вернуть все 10 методов, но было бы очень сложно запрограммировать большую программу с 1000 методами.

Я мог бы сделать исключение. Это будет работать, если какой-либо метод в стеке вызовов (кроме реактора) не приведет к исключению.

Я мог бы сделать следующее. Однако это добавит много ожидающих Deferred s для накапливания в реакторе Twisted.

while True: 
    d  = defer.Deferred() 
    d.delay = reactor.callLater(sys.maxint, d.callback, None) 

    yield d 

Есть ли другие решения?

Примечание: Решение Python 2.6 было бы идеальным.

+0

Для чего это стоит, в «витой» нет «волокна». Волокна представляют собой совместную библиотеку потоков для Windows - https://msdn.microsoft.com/en-us/library/windows/desktop/ms682661%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 - и Twisted не работает аналогичным образом. – Glyph

+0

Я не был уверен, что назвать то, что делает Twisted. Вот почему я вкладывал волокна в кавычки. Однако, прочитав https://en.wikipedia.org/wiki/Fiber_%28computer_science%29, кажется, что волокно - правильное слово. У вас есть лучшее слово, пожалуйста, поделитесь. – Nathan

ответ

0

Решение состоит в том, чтобы просто позвонить cancel() по отложенному до yield ing. Код не продолжается после yield.

d  = defer.Deferred() 
d.delay = reactor.callLater(sleepTime, d.callback, None) 

d.cancel() 

yield d 
returnValue(None) 
Смежные вопросы