Ubuntu 16.04上的Python 3.x
我的程序旨在监视传入的整数流(data
)。
当整数是> = 5时,我想要一个新线程产生。
这个新线程将“永远”记录数字,直到整数再次低于5,在这种情况下,线程应该“死”。
我希望这个过程无休止地重复;每当我们达到5时,我们会生成一个新线程,然后将其杀死。
我在其自己的线程中有进程counter
,因为最终我将放入一个tkinter GUI(在那里非常明显)。
我运行此代码,一切都按计划运行......
When we reach 5, a new thread is created!
When we fall below 5, the thread stops running use_data
...
When we climb back up to 5, nothing happens with respect to creating a new thread.
我的问题与不“杀死”前一个帖子有关;我的线程检查是好的我认为,如果线程列表threads
为空,或者唯一剩余的线程为_MainThread
,则应该创建一个新线程。我知道数字流data
设置可能会伤害你的眼睛,它也会伤害我的。
守则:
import time
import random
import queue
import threading
import logging
logging.basicConfig(level=logging.DEBUG, format='(%(threadName)s):%(message)s')
threads = []
data = list(list(range(10)) + list(reversed(range(10))))
def start_new_thread(thread_name):
logging.debug('...init thread creator...')
t = threading.Thread(name=thread_name, target=use_data)
t.daemon = True
logging.debug('...starting new thread...')
threads.append(t)
t.start()
logging.debug('...ALIVE THREADS: {}'.format(threads))
def kill_thread():
stopFlag.set()
def counter():
global threads
global data
x = 0
for i in data:
time.sleep(0.5)
logging.debug(i)
if i > 5:
logging.debug('Flow reached')
logging.debug('Counter thread: {}'.format(threading.current_thread().getName()))
start_event.set()
if not threads:
logging.debug('Empty thread list; creating a new one...')
x += 1
start_new_thread(thread_name='THREAD {}'.format(x))
elif threading.current_thread().__class__.__name__ == '_MainThread':
logging.debug('_MainThread is the only remaining thread; creating a new one...')
x += 1
start_new_thread(thread_name='THREAD {}'.format(x))
else:
kill_thread()
start_event.clear()
counter()
def use_data():
start_event.wait()
logging.debug('...Start Func: {}....'.format(threading.current_thread()))
while start_event.is_set():
logging.debug('Data thread: {}'.format(threading.current_thread().getName()))
logging.debug('POLLING...')
time.sleep(0.5)
if __name__ == '__main__':
process_thread = threading.Thread(name='Process Thread', target=counter)
start_event = threading.Event()
stopFlag = threading.Event()
process_thread.start()
答案 0 :(得分:0)
没有。您的线程检查不正常
您在创建时将线程添加到线程列表(threads.append(t)
),但您永远不会删除它们。如果您使用use_data
删除threads.remove(threading.current_thread())
末尾的退出主题,那将更有意义。因此,在您创建了一个帖子后,if not threads
永远不会成立。
此if语句:elif threading.current_thread().__class__.__name__ == '_MainThread':
将永远不会触发,因为主线程永远不会进入此函数。主线程用target=counter
创建第一个线程(' Process Thread'),然后主线程完成并退出。 "处理线程"无论如何,这是唯一进入此功能的线程,因此名称比较毫无意义。
总而言之,你的第一个' if'不会触发,因为threads
在第一个线程启动后永远不会为空。你的第二个'如果'赢了永远触发器。因此,start_new_thread
只会被调用一次。