最简单的方法来获得完整的功能参考堆栈?

时间:2016-12-28 17:33:04

标签: python multithreading python-3.x

我有一个缓存处理函数,用于处理线程中放置在队列中的函数。

当控制台空闲时调用缓存处理程序。我需要能够知道缓存处理程序是否正在处理某个函数,或者它是否在缓存处理程序循环之外执行。

有些逻辑如此:

如果引用函数堆栈中的缓存处理程序,则返回True:

这是缓存处理程序代码:

# Processing all console items in queue.
def process_console_queue():
    log = StandardLogger(logger_name='console_queue_handler')

    if not CONSOLE_CH.CONSOLE_QUEUE:
        return


    set_console_lock()

    CONSOLE_CH.PROCESSING_CONSOLE_QUEUE.acquire()

    print('\nOutputs held during your last input operation: ')

    while CONSOLE_CH.CONSOLE_QUEUE:
        q = CONSOLE_CH.CONSOLE_QUEUE[0]
        remove_from_console_queue()
        q[0](*q[1], **q[2])

    CONSOLE_CH.PROCESSING_CONSOLE_QUEUE.release()
    release_console_lock()
    return

如果该代码调用一个调用函数的函数,该函数调用一个函数....(该行链接中的任何地方由process_console_queue调用)在被调用函数内返回True。

这是怎么做到的?

1 个答案:

答案 0 :(得分:2)

如何使用具有属性threading.local的全局in_cache_handler对象?

让缓存处理程序在输入时将属性设置为True,并在退出时将其设置为False。然后,检查该属性的任何函数都可以判断缓存处理程序是否位于堆栈下面的某个位置。

import threading
thread_local_object = threading.local()
thread_local_object.in_cache_handler = False

def cache_handler(...):
    try:
        thread_local_object.in_cache_handler = True
        ...
    finally:
        thread_local_object.in_cache_handler = False

def some_random_function(...):
    if thread_local_object.in_cache_handler:
        ...
    else
        ...