多线程 - 需要我的线程进程来产生另一个线程

时间:2018-03-07 16:26:31

标签: multithreading python-3.x python-multithreading

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()

1 个答案:

答案 0 :(得分:0)

没有。您的线程检查不正常

  1. 您在创建时将线程添加到线程列表(threads.append(t)),但您永远不会删除它们。如果您使用use_data删除threads.remove(threading.current_thread())末尾的退出主题,那将更有意义。因此,在您创建了一个帖子后,if not threads永远不会成立。

  2. 此if语句:elif threading.current_thread().__class__.__name__ == '_MainThread':将永远不会触发,因为主线程永远不会进入此函数。主线程用target=counter创建第一个线程(' Process Thread'),然后主线程完成并退出。 "处理线程"无论如何,这是唯一进入此功能的线程,因此名称比较毫无意义。

  3. 总而言之,你的第一个' if'不会触发,因为threads在第一个线程启动后永远不会为空。你的第二个'如果'赢了永远触发器。因此,start_new_thread只会被调用一次。