Приостановка потока с использованием класса потоков - PullRequest
18 голосов
/ 16 июля 2010

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

Я использую

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

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

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

Спасибо.

Ответы [ 5 ]

12 голосов
/ 11 февраля 2013

У меня возникла та же проблема, пока я не нашел ответ.

Я также провел несколько тестов скорости, время для установки флага и действия, которые нужно предпринять, приятно быстро 0,00002 секунды наМедленный 2-процессорный Linux box.

Пример теста паузы потока с использованием событий set () и clear ()

By 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)
8 голосов
/ 16 июля 2010

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

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

2 голосов
/ 16 июля 2010

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

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

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

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

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

2 голосов
/ 16 июля 2010

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

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

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

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

1 голос
/ 16 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...