2015-11-04 5 views
1

Я не уверен, почему это не работает. Поток начинается, как только он определяется и, кажется, не находится в реальной теме ... Может быть, я что-то упустил.Threading бесконечный цикл while в Python 2

import threading 
import time 

def endless_loop1(): 
    while True: 
     print('EndlessLoop1:'+str(time.time())) 
     time.sleep(2) 

def endless_loop2(): 
    while True: 
     print('EndlessLoop2:'+str(time.time())) 
     time.sleep(1) 

print('Here1') 
t1 = threading.Thread(name='t1', target=endless_loop1(), daemon=True) 
print('Here2') 
t2 = threading.Thread(name='t2', target=endless_loop2(), daemon=True) 
print('Here3') 
t1.start() 
print('Here4') 
t2.start() 

Выходы:

Here1 
EndlessLoop1:1446675282.8 
EndlessLoop1:1446675284.8 
EndlessLoop1:1446675286.81 

ответ

4

Вы должны дать target= на вызываемый объект.

target=endless_loop1() 

Здесь вы на самом деле вызоваendless_loop1(), поэтому он запускается на выполнение в основном потоке сразу. То, что вы хотите сделать, это:

target=endless_loop1 

, который проходит ваш Thread объект функции, так что можно назвать себя.

Кроме того, daemon не на самом деле параметр инициализации, вам необходимо установить его отдельно перед вызовом start:

t1 = threading.Thread(name='t1', target=endless_loop1) 
t1.daemon = True 
+0

Так что, если я хотел передать «аргумент» в потоке перед выполнением я должен был бы заранее объявите переменную 'endless_loop1.args = x', а затем' target = endless_loop1' вместо 'target = endless_loop1 (x)'? – s4w3d0ff

+1

@ s4w3d0ff no, конструктор 'Thread' имеет для этого параметр' args', поэтому вы можете просто сказать: 'Thread (name = 't1', target = endless_loop1, args = (x,))' – tzaman

+0

ah, good знать спасибо – s4w3d0ff

Смежные вопросы