Как мне прервать темы в Twisted? - PullRequest
4 голосов
/ 07 марта 2012

У меня проблема со следующим кодом.В моей реальной ситуации логика, инкапсулированная SomeClass, имеет блокирующую логику, поэтому мне нужно, чтобы она вызывалась с reactor.callFromThread().Я хочу, чтобы цикл в SomeClass.run () останавливался, когда я посылаю сигнал sigint, и я понимаю, что помещение некоторого кода для этого в ловушку addSystemEvent должно обработать это.Я думаю, что это может быть больше проблемой с моим пониманием Python и потоков, чем с самим Twisted.

from twisted.internet import reactor
import time

class SomeClass():
    def __init__(self):
        self.running = False

    def run(self):
        self.running = True
        while(self.running):
            print('foo')
            time.sleep(5)

    def stop(self):
        print('stopping')
        self.running = False

someClassInstance = SomeClass()

def cleanup():
    someClassInstance.stop()

reactor.addSystemEventTrigger('before', 'shutdown', cleanup)
reactor.callFromThread(someClassInstance.run)
reactor.run()

1 Ответ

4 голосов
/ 07 марта 2012

Невозможно безопасно и вообще прерывать поток в языке программирования, таком как Python.Раньше в Java была эта функция, но они удалили ее , потому что она небезопасна.(В Java появилась новая функция Thread.interrupt, которая является ограниченной версией с меньшим количеством проблем, но все же усложняет задачу написания многопоточного кода).

Именно поэтому Twisted предоставляет множество способов избежатьпотоки.Если они вам не нужны, не используйте их.Например, вместо вызова time.sleep(n); foo() просто выполните reactor.callLater(n, foo), и вы получите тот же эффект, за исключением того, что callLater возвращает объект, который вы можете использовать, чтобы легко отменить или отложить выполнение foo, если этого не произошлопока что.

Если у вас есть пример того, что вы на самом деле пытаетесь сделать, вместо того, чтобы заменить "time.sleep" на "и тогда что-то происходит", пожалуйста, откройте другой вопрос, поясняющийЭто.Ответ на самом деле зависит от что вы делаете - вы действительно ждете вовремя?Блокировка ввода / вывода другому процессу?Другая машина?В Twisted есть все необходимое.

...