代码之家  ›  专栏  ›  技术社区  ›  Jay Bell

我如何处理python中的线程结束事件?

  •  0
  • Jay Bell  · 技术社区  · 10 年前

    假设我正在解析来自几个不同交换的数据,我希望每个额外的数据同时运行,因此我在自己的进程中启动每个数据,但在每个进程中,我希望将输出字符串添加到列表中,然后将该列表返回到主列表,并将其输出到curses UI。简单版本:

    def exchange1():
        #do stuff
        #add to output list
        return output_list
    
    def exchange2():
        #do stuff
        #add to output list
        return output_list
    
    output_list = startnewprocess(exchange1)
    output_list = startnewprocess(exchange2)
    
    window.getch()
    #have it so I can input different options to do stuff while those threads above are running
    

    我如何使其在其中一个过程完成时再次启动?

    或者,如何使其能够从主函数检索已添加到进程内output_list中的内容,以便在交换函数内有一段时间True:循环,以便将数据输出到进程外的屏幕?

    1 回复  |  直到 10 年前
        1
  •  1
  •   dano    10 年前

    您可以使用 multiprocessing 为此:

    import time
    import multiprocessing
    
    def exchange1(q):
        while True:
            time.sleep(2)
            q.put([1, 2, 3, 4, 5])
    
    def exchange2(q):
        while True:
            time.sleep(4)
            q.put([4, 5, 6, 7, 8])
    
    if __name__ == "__main__":
        q = multiprocessing.Queue()
        p1 = multiprocessing.Process(target=exchange1, args=(q,))
        p2 = multiprocessing.Process(target=exchange2, args=(q,))
        p1.start()
        p2.start()
        while True:
            out = q.get()
            print("out is {}".format(out))
    

    输出:

    out is [1, 2, 3, 4, 5]
    out is [1, 2, 3, 4, 5]
    out is [4, 5, 6, 7, 8]
    out is [1, 2, 3, 4, 5]
    out is [1, 2, 3, 4, 5]
    out is [4, 5, 6, 7, 8]
    

    请注意,如果您还想使用 getch 要在中读取字符,必须在父进程中的单独线程中侦听从队列返回的数据,并使用curses库中的一些线程安全机制来更新UI:

    def waiter(q):
        while True:
            out = q.get()
            print("out is {}".format(out))
            # Update UI in a thread-safe way
    
    if __name__ == "__main__":
        q = multiprocessing.Queue()
        p1 = multiprocessing.Process(target=exchange1, args=(q,))
        p2 = multiprocessing.Process(target=exchange2, args=(q,))
        p1.start()
        p2.start()
        t = threading.Thread(target=waiter, args=(q,))
        t.daemon = True
        t.start()
        while True:
            char = window.getch()
            # Other stuff