Неблокирующий класс в Python (отдельный поток) - PullRequest
2 голосов
/ 14 октября 2010

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

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

В небольшом примере:

#!/usr/bin/python2.4

import threading
import time

class Sample(threading.Thread):
    def __init__(self):
        super(Sample, self).__init__()
        self.status = 1
        self.stop = False

    def run(self):
        while not(self.stop):
            pass

    def getStatus(self):
        return self.status

    def setStatus(self, status):
        self.status = status

    def test(self):
        while self.status != 0:
            time.sleep(2)

#main
sample = Sample()
sample.start()
sample.test()
sample.setStatus(0)
sample.stop()

Мне бы хотелось, чтобы экземпляр «sample» работал как отдельный поток (отсоединенный от основного1) так, в примере, когда основной поток достигает sample.test (), sample (и только «sample») перейдет в спящий режим на 2 секунды.В то же время основной поток продолжит свое выполнение и установит состояние семпла в 0. Когда через 2 секунды пробуждается «семпл», он увидит состояние = 0 и выйдет из цикла while.

Проблема в том, что если я сделаю это, строка sample.setStatus (0) никогда не будет достигнута (создавая бесконечный цикл).Я назвал потоки, и оказалось, что, выполняя это, test () запускается основным потоком.

Полагаю, я не очень хорошо понимаю потоки в python ...

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 14 октября 2010

Метод run () объекта - это то, что выполняется в отдельном потоке. Когда вы вызываете sample.test (), он выполняется в основном потоке, и вы получаете бесконечный цикл.

1 голос
/ 14 октября 2010

Может, как-то так?

import threading
import time

class Sample(threading.Thread):
    def __init__(self):
        super(Sample, self).__init__()
        self.stop = False

    def run(self):
        while not(self.stop):
            print('hi')
            time.sleep(.1)

    def test(self):
        print('testing...')
        time.sleep(2)

#main
sample = Sample()
sample.start()      # Initiates second thread which calls sample.run()
sample.test()       # Main thread calls sample.test
sample.stop=True    # Main thread sets sample.stop
sample.join()       # Main thread waits for second thread to finish
...