Python 获取完整函数引用堆栈的最简单方法?
我有一个缓存处理函数,它处理线程放置在队列中的函数 当控制台空闲时,将调用缓存处理程序。我需要知道一个函数是由缓存处理程序处理的,还是在缓存处理程序循环之外执行的 有些逻辑是这样的: 如果缓存处理程序在引用函数堆栈中,则返回True: 以下是缓存处理程序代码:Python 获取完整函数引用堆栈的最简单方法?,python,multithreading,python-3.x,Python,Multithreading,Python 3.x,我有一个缓存处理函数,它处理线程放置在队列中的函数 当控制台空闲时,将调用缓存处理程序。我需要知道一个函数是由缓存处理程序处理的,还是在缓存处理程序循环之外执行的 有些逻辑是这样的: 如果缓存处理程序在引用函数堆栈中,则返回True: 以下是缓存处理程序代码: # Processing all console items in queue. def process_console_queue(): log = StandardLogger(logger_name='console_que
# 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
如果代码调用了一个函数,而这个函数调用了一个函数。。。。(该链中的任何位置由进程\控制台\队列调用)在被调用函数中返回True
如何做到这一点?在缓存处理程序中使用一个全局
线程化.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
...
与其搅乱堆栈,为什么不给函数另一个参数,表示它是否被缓存处理程序调用?这意味着用另一个参数重构项目中的每个函数。在整个项目中使用了两个函数,如果缓存处理程序调用堆栈中的任何位置,则需要稍微不同地处理输入。如果我可以测试,1-2行代码应该可以在不进行完全重构的情况下完成这项任务。如果我正确理解这一点,它是一个标志,表示“缓存处理程序正在运行”?到任何查找标志的函数?但是,如果一个线程在缓存处理程序运行时调用一个函数,它将不会区分名为function的缓存处理程序和名为function的线程?我理解正确吗?@Emily,threading.local()
对象很特殊。它为程序中的每个线程保留其属性的单独副本。因此,当缓存处理程序正在运行且函数与缓存处理程序在同一线程中运行时,函数才会看到thread\u local\u object.in\u cache\u handler==True
。如果缓存处理程序直接或间接调用了函数,则这两种情况都可以成立。