У меня есть долгий процесс, который я запланировал выполнять в потоке, потому что иначе заморозит ui в моем wxpython приложении.
Я использую
threading.Thread(target = myLongProcess).start()
для запуска потока и это работает, но я не знаю, как приостановить и возобновить поток. Я посмотрел в документах Python для вышеупомянутых методов, но не смог найти их.
Кто-либо мог предложить, как я мог сделать это?
Спасибо.
Не существует метода для других потоков принудительно приостановить поток (так же, как и для других потоков убить этот поток) - целевой поток должен сотрудничать, время от времени проверяя соответствующие "флаги" (threading.Condition
может быть подходящим для случая паузы/отключения).
Если вы работаете на платформе unix-y (в принципе, на любой, кроме windows), вы можете использовать multiprocessing
вместо threading
- that гораздо мощнее, и позволяет посылать сигналы "другому процессу"; SIGSTOP должен безоговорочно приостановить процесс, а SIGCONT продолжить его (если вашему процессу нужно сделать что-то прямо перед приостановкой, рассмотрите также сигнал SIGTSTP, который другой процесс может поймать для выполнения таких обязанностей перед приостановкой. (Возможно, существуют способы добиться такого же эффекта в Windows, но я не знаю о них, если они вообще существуют).
Модуль многопроцессорной обработки отлично работает в Windows. См. документацию здесь (конец первого параграфа):
http://docs.python.org/library/multiprocessing.html
На IRC-канале wxPython у нас было несколько человек, которые пробовали мультипроцессинг, и они сказали, что он работает. К сожалению, я еще не видел никого, кто написал бы хороший пример мультипроцессинга и wxPython.
Если вы (или кто-либо другой здесь) придумаете что-нибудь, пожалуйста, добавьте это на вики-страницу wxPython по многопоточности здесь: http://wiki.wxpython.org/LongRunningTasks
Возможно, вы захотите заглянуть на эту страницу, так как там есть несколько интересных примеров с использованием потоков и очередей.
Вы можете использовать сигналы: http://docs.python.org/library/signal.html#signal.pause
Чтобы избежать использования сигналов, вы можете использовать передачу токена система. Если вы хотите приостановить его из основного потока пользовательского интерфейса, вы, вероятно, можете просто использовать объект Queue.Queue для связи с ним.
Просто поместите в очередь сообщение о том, что поток находится в спящем режиме на определенное время.
В качестве альтернативы вы можете просто непрерывно помещать токены в очередь из основного потока пользовательского интерфейса. Рабочий должен просто проверять очередь каждые N секунд (0,2 или что-то в этом роде). Когда нет токенов для удаления из очереди, рабочий поток блокируется. Если вы хотите, чтобы он запустился снова, просто начните снова помещать токены в очередь из основного потока.
Вы можете взглянуть на Windows API для приостановки потоков .
Насколько мне известно, не существует эквивалента POSIX / pthread. Более того, я не могу определить, доступны ли дескрипторы / идентификаторы потоков из Python . Есть также потенциальные проблемы с Python, поскольку его планирование выполняется с использованием собственного планировщика, маловероятно, что он ожидает приостановки потоков, особенно если потоки приостановлены, удерживая GIL, среди других возможностей.