Мне нужно написать простое приложение, которое запускает два потока:
- поток 1: выполняется в определенные периоды времени, скажем, каждую минуту
- поток 2: просто «нормальный» цикл True, который выполняет «вещи»
если бы не требование работать с определенным интервалом, я бы вообще не смотрел на скрученность, но простой сон (60) не достаточно хорош и конструкция вроде:
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.run()
Выглядело очень просто, чтобы достичь того, чего я хотел там.
Теперь, как мне "правильно" добавить другую ветку?
Я вижу здесь два варианта:
- Используйте библиотеку потоков и запустите два «потока python», один из которых выполняет мой цикл while, а другой - в реактор.run (). Но Google, похоже, возражает против такого подхода и предлагает использовать витую многопоточность
- Использовать витую резьбу. Это то, что я пробовал, но как-то мне это кажется немного неуклюжим.
Вот что я придумал:
def timed_thread():
print 'i will be called every 1 minute'
return
def normal_thread():
print 'this is a normal thread'
time.sleep(30)
return
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.callInThread(normal_thread)
reactor.run()
Это похоже на работу, но! Я не могу остановить приложение. Если я нажму ^ C, он ничего не сделает (без 'callInThread' он просто остановится, как вы и ожидаете). ^ Z разлетается в оболочку, и если я затем произвожу 'kill% 1', он, кажется, завершает процесс (оболочка сообщает об этом), но "нормальный" поток продолжает работать. kill PID не избавился бы от этого, и единственное лекарство - это kill -9. Действительно странно.
Итак. Что я делаю неправильно? Это правильный подход для реализации двух потоков в витой? Должен ли я не заморачиваться с витой? Какие еще «стандартные» альтернативы предназначены для осуществления синхронизированных вызовов? («Стандартный», я имею в виду, что я могу easy_install или yum установить их, я не хочу начинать загрузку и использование некоторых случайных сценариев со случайных веб-страниц).