线程中的阻塞语句导致杀死线程的时间更长?
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"
【讨论】:
以上是关于线程中的阻塞语句导致杀死线程的时间更长?的主要内容,如果未能解决你的问题,请参考以下文章