Приостановка класса поточной обработки использования потока

У меня есть долгий процесс, который я запланировал выполнять в потоке, потому что иначе заморозит ui в моем wxpython приложении.

Я использую

threading.Thread(target = myLongProcess).start()

для запуска потока и это работает, но я не знаю, как приостановить и возобновить поток. Я посмотрел в документах Python для вышеупомянутых методов, но не смог найти их.

Кто-либо мог предложить, как я мог сделать это?

Спасибо.

18
задан jimbo 16 July 2010 в 06:23
поделиться

4 ответа

Не существует метода для других потоков принудительно приостановить поток (так же, как и для других потоков убить этот поток) - целевой поток должен сотрудничать, время от времени проверяя соответствующие "флаги" (threading.Condition может быть подходящим для случая паузы/отключения).

Если вы работаете на платформе unix-y (в принципе, на любой, кроме windows), вы можете использовать multiprocessing вместо threading - that гораздо мощнее, и позволяет посылать сигналы "другому процессу"; SIGSTOP должен безоговорочно приостановить процесс, а SIGCONT продолжить его (если вашему процессу нужно сделать что-то прямо перед приостановкой, рассмотрите также сигнал SIGTSTP, который другой процесс может поймать для выполнения таких обязанностей перед приостановкой. (Возможно, существуют способы добиться такого же эффекта в Windows, но я не знаю о них, если они вообще существуют).

8
ответ дан 30 November 2019 в 08:26
поделиться

Модуль многопроцессорной обработки отлично работает в Windows. См. документацию здесь (конец первого параграфа):

http://docs.python.org/library/multiprocessing.html

На IRC-канале wxPython у нас было несколько человек, которые пробовали мультипроцессинг, и они сказали, что он работает. К сожалению, я еще не видел никого, кто написал бы хороший пример мультипроцессинга и wxPython.

Если вы (или кто-либо другой здесь) придумаете что-нибудь, пожалуйста, добавьте это на вики-страницу wxPython по многопоточности здесь: http://wiki.wxpython.org/LongRunningTasks

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

2
ответ дан 30 November 2019 в 08:26
поделиться

Вы можете использовать сигналы: http://docs.python.org/library/signal.html#signal.pause

Чтобы избежать использования сигналов, вы можете использовать передачу токена система. Если вы хотите приостановить его из основного потока пользовательского интерфейса, вы, вероятно, можете просто использовать объект Queue.Queue для связи с ним.

Просто поместите в очередь сообщение о том, что поток находится в спящем режиме на определенное время.

В качестве альтернативы вы можете просто непрерывно помещать токены в очередь из основного потока пользовательского интерфейса. Рабочий должен просто проверять очередь каждые N секунд (0,2 или что-то в этом роде). Когда нет токенов для удаления из очереди, рабочий поток блокируется. Если вы хотите, чтобы он запустился снова, просто начните снова помещать токены в очередь из основного потока.

2
ответ дан 30 November 2019 в 08:26
поделиться

Вы можете взглянуть на Windows API для приостановки потоков .

Насколько мне известно, не существует эквивалента POSIX / pthread. Более того, я не могу определить, доступны ли дескрипторы / идентификаторы потоков из Python . Есть также потенциальные проблемы с Python, поскольку его планирование выполняется с использованием собственного планировщика, маловероятно, что он ожидает приостановки потоков, особенно если потоки приостановлены, удерживая GIL, среди других возможностей.

1
ответ дан 30 November 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: