Как начать и остановить поток?

Извините за старый вопрос. Я уточнил это. Как я могу запустить стоп-поток с моим бедным классом нитей?

EDIT : он находится в цикле, я хочу перезапустить его снова в начале кода. Как я могу запустить start-stop-restart-stop-restart?

Мои занятия:

import threading class Concur(threading.Thread): def __init__(self): self.stopped = False threading.Thread.__init__(self) def run(self): i = 0 while not self.stopped: time.sleep(1) i = i + 1 

В главном коде я хочу:

 inst = Concur() while conditon: inst.start() #after some operation inst.stop() #some other operation 

3 Solutions collect form web for “Как начать и остановить поток?”

Это идея Дэвида Хеффернана. Пример ниже выполняется в течение 1 секунды, затем останавливается на 1 секунду, затем выполняется в течение 1 секунды и т. Д.

 import time import threading import datetime as DT import logging logger = logging.getLogger(__name__) def worker(cond): i = 0 while True: with cond: cond.wait() logger.info(i) time.sleep(0.01) i += 1 logging.basicConfig(level=logging.DEBUG, format='[%(asctime)s %(threadName)s] %(message)s', datefmt='%H:%M:%S') cond = threading.Condition() t = threading.Thread(target=worker, args=(cond, )) t.daemon = True t.start() start = DT.datetime.now() while True: now = DT.datetime.now() if (now-start).total_seconds() > 60: break if now.second % 2: with cond: cond.notify() 

Вы не можете остановить и затем перезапустить поток, потому что вы не можете вызвать его start() снова после того, как его метод run() завершился. Однако вы можете заставить этот метод эффективно приостановить, а затем возобновить выполнение, используя переменную threading.Condition чтобы избежать проблем с параллелизмом при проверке или изменении состояния запуска.

Condition объектов Condition есть связанный объект threading.Lock и методы, ожидающие его освобождения, и будут уведомлять о каких-либо ожидающих потоках, когда это произойдет. Вот пример, полученный из кода в вашем вопросе, который показывает, что это делается. В этом случае я сделал переменную Condition частью экземпляров подкласса Thread чтобы лучше инкапсулировать реализацию, избегая введения дополнительных глобальных переменных:

 import threading import time class Concur(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.iterations = 0 self.daemon = True # OK for main to exit even if instance is still running self.paused = True # start out paused self.state = threading.Condition() def run(self): self.resume() # unpause self while True: with self.state: if self.paused: self.state.wait() # block until notified # do stuff time.sleep(.1) self.iterations += 1 def resume(self): with self.state: self.paused = False self.state.notify() # unblock self if waiting def pause(self): with self.state: self.paused = True # make self block and wait class KeepRunning(object): def __init__(self, seconds=10): self.run_time = seconds self.start_time = time.time() @property def condition(self): return time.time()-self.start_time < self.run_time running = KeepRunning() concur = Concur() concur.start() # calls run() method while running.condition: concur.resume() #after some operation concur.pause() #some other operation print('concur.iterations == {}'.format(concur.iterations)) # show thread executed 

Реализация stop() будет выглядеть так:

 def stop(self): self.stopped = True 

Если вы хотите перезапустить, вы можете просто создать новый экземпляр и начать это.

 while conditon: inst = Concur() inst.start() #after some operation inst.stop() #some other operation 

Документация для Thread дает понять, что метод start() может быть вызван только один раз для каждого экземпляра класса.

Если вы хотите приостановить и возобновить поток, вам нужно будет использовать переменную условия .

  • Mutli-threading python с Tkinter
  • Аварии PyQt и безопасность потоков
  • Эквивалент setInterval в python
  • Как вставить несколько экземпляров подпроцессов в Python 2.7?
  • Нет вывода на печать из дочерней многопроцессорности. Процесс, если программа не сработает
  • Выберите и обновите в той же транзакции с помощью python sqlite
  • Блокировка потоков wxPython
  • Python: поток продолжается
  • Как я могу убить поток в python
  • Как порождать будущее, только если доступен свободный рабочий
  • Создание потоков в python
  • Python - лучший язык программирования в мире.