线程中的阻塞语句导致杀死线程的时间更长?

Posted

技术标签:

【中文标题】线程中的阻塞语句导致杀死线程的时间更长?【英文标题】:Blocking statement in thread results in longer time to kill thread? 【发布时间】:2015-07-27 21:38:40 【问题描述】:

我在 Python 中启动了一个自定义线程,它应该定期打印一些有关当前进度的统计信息。一旦用户表示停止程序,所有线程都必须被杀死。到目前为止,这有效,但对于所述线程。

def print_statistics(thread_id):
    print "Thread  started (information thread)".format(thread_id)

    # thread_stop_event is of type threading.Event
    while (not thread_stop_event.is_set()):

        print "important information"
        time.sleep(5) # print some information every five seconds


    print "Thread  is terminating - Bye".format(thread_id)

一旦用户指示退出程序,我就会使用未设置的 threading.Event。然后守护进程结束,线程自动停止。

我知道 time.sleep()。因为它只阻塞了五秒钟,所以在最坏的情况下应该在这段时间过去后杀死线程。

现在我做了以下观察:用户等待他的命令杀死所有线程的时间越长,杀死print_statistics 的时间就越长。为什么?最多不应该花五秒钟吗?

编辑

这是处理所有线程的主要方法。首先启动工作线程,并最终启动为用户提供当前统计信息的信息线程。

def run():
    running_threads = list()

    # start working threads
    for i in range(0, max_threads):
        t = Thread(target=worker_thread, args=(i,))
        running_threads.append(t)
        running_threads[i].start()

    # start thread that provides user with statistical information
    inf_thread = Thread(target=print_statistics, args=(max_threads,))
    inf_thread.start()

    # wait for user interrupt
    while True:
        input = raw_input("\nType \"quit\" to quit!\n")
        if input == "quit":
            thread_stop_event.set() # inform all threads to terminate
            break
        else:
            print "Input not recognized. Try again!"

【问题讨论】:

你能提供一个完整的例子来说明这个问题吗?设置事件的主线程丢失。 我知道这并不能回答你的问题,但你有没有尝试过使用异步 IO 而不是产生新线程?太多次我使用线程只是为了它的非阻塞效果而不是为了 cpu 缩放。不久前我已经切换到gevent(还有其他选项),现在我不需要担心线程流氓了。 【参考方案1】:

我不知道是什么问题,但你应该使用

while not thread_stop_event.wait(5):
    print "important information"

【讨论】:

以上是关于线程中的阻塞语句导致杀死线程的时间更长?的主要内容,如果未能解决你的问题,请参考以下文章

线程阻塞和挂起(网络收集)

线程阻塞导致的性能问题分析

哪些阻塞操作会导致 STA 线程泵送 COM 消息?

RocketMQ与Dubbo之间线程之间如何阻塞和唤醒

在辅助线程中调用 select()/pselect() 会导致主线程阻塞吗?

由于无法关闭数据库连接,线程被阻塞