2015-09-03 2 views
0

Я новичок в многопоточности, поэтому ответ, вероятно, очень прост.Наследование threading.Thread класс не работает

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

class hello(threading.Thread): 
    def __init__(self,min,max): 
     threading.Thread.__init__(self) 
     time.sleep(max) 

     for i in range(1000): 
      print random.choice(range(min,max)) 

h = hello(3,5) 
k = hello(0,3) 

Я заметил, что это не работает (первые выходы цифры от 3 до 5)

Не могли бы вы объяснить, что я делаю неправильно?
Является ли это наследование посвященным, чтобы сделать что-то еще?

EDIT: Я хочу, чтобы эти два объекта были параллельными, так как второй объект имеет меньшие ожидания, он должен печатать эти числа раньше.

Согласно комментарию porglezomps, я попытался изменить код - добавьте метод, который печатает эти числа, но он печатает его последовательно. Проблема все еще существует.

+0

Я не могу видеть, какой образ вы думаете, что вы используете наследование классов здесь (кроме как в тривиальных что класс наследует от Thread). Однако вы не указали, в чем проблема; как ваш результат отличается от того, что вы ожидаете? –

+1

Вы выполняете всю свою работу в конструкторе, но конструктор работает в основном потоке. – porglezomp

+0

@porglezomp Хорошо, я попытался создать метод класса, который печатает его, но проблема все еще существует. Класс привет (threading.Thread): Защиту __init __ (самостоятельно, мин, макс): threading.Thread .__ __ INIT (само) self.min = мин self.max = макс Защиту PRINT_IT (само): время .sleep (self.max) для i в диапазоне (20): print random.choice (диапазон (self.min, self.max)) –

ответ

3

В документации для threading указано, что вы должны переопределить метод run(), а затем использовать метод start() для начала выполнения в новом потоке. В вашем случае, ваш код должен быть:

class Hello(threading.Thread): 
    def __init__(self, min, max): 
     self.min, self.max = min, max 
     threading.Thread.__init__(self) 

    def run(self): 
     time.sleep(self.max) 

     for i in range(1000): 
      print random.choice(range(self.min, self.max)) 

# This creates the thread objects, but they don't do anything yet 
h = Hello(3,5) 
k = Hello(0,3) 

# This causes each thread to do its work 
h.start() 
k.start() 
1

регулярная реализация Пайтона нити уже знает, как выполнить задачу, так что если вы не создавая особый вид резьбы (не особый вид задачи) - то, что вы, вероятно, хотите, чтобы использовать обычную нить:

def task(_min, _max): # 'min' and 'max' are actual functions! 
    time.sleep(_max) 
    for _ in range(1000): 
     print random.choice(range(_min,_max)) 

А теперь создать поток для выполнения задачи:

t1 = threading.Thread(target=task, args=(3, 5,)) 
t2 = threading.Thread(target=task, args=(3, 5,)) 

t1.start() 
t2.start() 
Смежные вопросы