Подтвердить что ты не робот

Приостановка потока с использованием класса потоков

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

Я использую

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

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

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

Спасибо.

4b9b3361

Ответ 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, среди других возможностей.