Приостановка потока с использованием класса потоков
У меня есть длинный процесс, который я запланировал запустить в потоке, потому что в противном случае он заморозит ui в моем приложении wxpython.
Я использую
threading.Thread(target = myLongProcess).start()
чтобы начать поток, и он работает, но я не знаю, как приостановить и возобновить поток. Я просмотрел документы python для вышеуказанных методов, но не смог их найти.
Может ли кто-нибудь предложить, как я мог это сделать?
Спасибо.
Ответы
Ответ 1
У меня была одна и та же проблема, пока я не нашел ответ.
Я также сделал некоторые тесты скорости, время установки флага и действия, которое нужно предпринять, приятно быстро 0.00002 секунды на медленном 2-процессорном ящике Linux.
Пример теста приостановки потока с использованием событий set() и clear()
По Rich O'Regan
import threading
import time
# This function gets called by our thread.. so it basically becomes the thread innit..
def wait_for_event(e):
while True:
print '\tTHREAD: This is the thread speaking, we are Waiting for event to start..'
event_is_set = e.wait()
print '\tTHREAD: WHOOOOOO HOOOO WE GOT A SIGNAL : %s', event_is_set
e.clear()
# Main code..
e = threading.Event()
t = threading.Thread(name='your_mum',
target=wait_for_event,
args=(e,))
t.start()
while True:
print 'MAIN LOOP: still in the main loop..'
time.sleep(4)
print 'MAIN LOOP: I just set the flag..'
e.set()
print 'MAIN LOOP: now Im gonna do some processing n shi-t'
time.sleep(4)
print 'MAIN LOOP: .. some more procesing im doing yeahhhh'
time.sleep(4)
print 'MAIN LOOP: ok ready, soon we will repeat the loop..'
time.sleep(2)
Ответ 2
Нет способа для других потоков принудительно приостанавливать поток (больше, чем для других потоков, чтобы убить этот поток) - целевой поток должен взаимодействовать, иногда проверяя соответствующие "флаги" (a threading.Condition
может быть подходит для случая паузы/отказа).
Если вы находитесь на платформе unix-y (вообще-то, кроме Windows, в основном), вы можете использовать multiprocessing
вместо threading
- это гораздо более мощная и позволяет отправлять сигналы в "другой процесс" "; SIGSTOP должен безоговорочно приостановить процесс и SIGCONT (если ваш процесс должен сделать что-то прямо перед паузой, рассмотрите также сигнал SIGTSTP, который другой процесс может поймать для выполнения такие обязанности перед приостановкой (могут быть способы получить такой же эффект для Windows, но я не осведомлен о них, если таковые имеются).
Ответ 3
Вы можете использовать сигналы: http://docs.python.org/library/signal.html#signal.pause
Чтобы избежать использования сигналов, вы можете использовать систему передачи токенов. Если вы хотите приостановить его из основного потока пользовательского интерфейса, вы могли бы просто использовать объект Queue.Queue для связи с ним.
Просто введите сообщение, сообщающее потоку спать в течение определенного количества времени в очереди.
В качестве альтернативы вы можете просто непрерывно вводить токены в очередь из основного потока пользовательского интерфейса. Работник должен просто проверять очередь каждые N секунд (0,2 или что-то в этом роде). Когда нет токенов для удаления, рабочий поток будет блокироваться. Когда вы хотите, чтобы он снова запустился, просто начните толкать токены в очередь из основного потока.
Ответ 4
Многопроцессорный модуль отлично работает в Windows. См. Документацию здесь (конец первого абзаца):
http://docs.python.org/library/multiprocessing.html
На IRC-канале wxPython у нас было несколько парней, которые пытались многопроцессорно работать, и они сказали, что это сработало. К сожалению, я еще не видел никого, кто написал хороший пример многопроцессорности и wxPython.
Если вы (или кто-либо еще здесь) придумаете что-нибудь, добавьте его на wiki-страницу wxPython по теме: http://wiki.wxpython.org/LongRunningTasks
Возможно, вы захотите проверить эту страницу вне зависимости от наличия нескольких интересных примеров с использованием потоков и очередей.
Ответ 5
Вы можете взглянуть на Windows API для приостановки потока.
Насколько я знаю, нет эквивалента POSIX/pthread. Кроме того, я не могу определить, являются ли образы/идентификаторы потоков которые доступны из Python. Есть также потенциальные проблемы с Python, поскольку его планирование выполняется с использованием собственного планировщика, маловероятно, что ожидается, что потоки будут приостановлены, особенно если потоки приостановлены, удерживая GIL, среди других возможностей.