【问题标题】:Simplest Way To Get Full Function Referring Stack?获得完整功能引用堆栈的最简单方法?
【发布时间】:2016-12-28 17:33:03
【问题描述】:

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

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

类似这样的一些逻辑:

如果引用函数堆栈中的缓存处理程序,则返回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。

这是怎么做到的?

【问题讨论】:

  • 与其搞乱堆栈,为什么不给函数另一个参数来表示它是否被缓存处理程序调用?
  • 这意味着用另一个 arg 重构项目中的每个函数。整个项目中使用了 2 个函数,如果它们在堆栈中的任何位置被缓存处理程序调用,它们需要对输入进行稍微不同的处理。如果我可以对此进行测试,那么 1-2 行代码就可以解决问题,而无需完全重构。

标签: python multithreading python-3.x


【解决方案1】:

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

让缓存处理程序在进入时将属性设置为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
        ...

【讨论】:

  • 如果我理解正确,这是一个标志,上面写着“缓存处理程序正在运行”?对于任何寻找标志的功能?但是,如果一个线程在缓存处理程序运行时调用一个函数,它不会区分称为函数的缓存处理程序与称为函数的线程吗?我理解正确吗?
  • @Emily,threading.local() 对象很特别。它为程序中的每个线程保留其属性的单独副本。因此,函数会看到thread_local_object.in_cache_handler==True 的唯一时间是缓存处理程序正在运行时并且该函数与缓存处理程序在同一线程中运行。这两种情况都成立的唯一方法是该函数被缓存处理程序直接或间接调用。
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2020-12-03
  • 1970-01-01
  • 2022-07-07
  • 2018-02-19
  • 2011-11-11
相关资源
最近更新 更多