2017-01-19 6 views
1

У меня довольно простая программа, в которую каждая задача, добавленная в taskq, выполняет и вычисляет что-то, скажем, в течение 30 секунд. Эта задача «не» работает в каком-то времени или для цикла.Python - Остановить длинный поток taskq

def run(self): 
    while not self.stopper.is_set(): 
     DO_MY_30_SECONDS_WORK(self) 
     self.task_done() 

Теперь, предполагая, что у меня есть thread.event и это можно проверить до/после выполнения задачи. Но есть ли способ сказать уже запущенному потоку остановить или закрыть его выполнение.

+0

У меня была проблема, похожая на ваш прошлый год, и использовала СИГНАЛы для решения проблемы. Вы можете запустить другой поток с помощью основного потока и запустить счетчик времени в вспомогательном потоке. Когда счетчик заканчивает подавать сигнал на главную нить и убивает его, получая в нем сигналы. Вы можете захотеть взглянуть на [это] (https://pymotw.com/2/signal/) – cengineer

+0

- ваша задача - некоторый код на Python, или это другая программа, которую вы запускаете с помощью 'subprocess'? – hansaplast

+0

Это просто код на Python, но, возможно, использование вызовов Curl. – Jay

ответ

1

Невозможно остановить свою бегущую нить, если DO_MY_30_SECONDS_WORK(self) блокирует. Возможно, вы могли бы установить его как daemon, и он будет внезапно убит, когда закончится выполнение вашей основной программы, это вызовет проблемы, если поток фактически содержит ресурсы (например, запись в файл) и, как правило, не рекомендуется заканчивать Тема.

Что вы можете сделать, это переконструировать DO_MY_30_SECONDS_WORK(self) и сделать его неблокирующим, что означает сокращение работы на мелкие кусочки и заставляют его проверять знак остановки в разумный промежуток времени, чтобы ваш поток был достаточно отзывчивым, чтобы завершите себя, когда вы скажете это сделать.

+0

. Спасибо ... Да, это то, что я собираюсь. Я просто разрезаю его на более мелкие кусочки. – Jay