gpt4 book ai didi

multithreading - 将异常抛出到另一个线程

转载 作者:行者123 更新时间:2023-12-03 13:10:15 26 4
gpt4 key购买 nike

这不是涉及捕获从另一个线程抛出的异常的任何问题的重复。

我有产生线程的代码,它关闭并完成自己的事情。

在将来的某个时候,我希望能够在另一个线程中抛出两个异常之一(即terminateinterrupt)。

一种实现方法是共享一个变量,并让另一个线程定期检查是否应终止该变量。我的首选是不受检查的约束(某些代码将独立于执行线程的库,并且不会编写检查代码)。

在我理想的解决方案中,您可能会遇到以下情况:调试时,您可能会发现auto i = 1 + 1引发异常,因为另一个线程告诉您的线程抛出该异常,而这恰好是您当时所在的行。

有办法吗?

最佳答案

是的,有可能在另一个线程中引发异常。

我将假设您知道为什么不应该在常规程序中执行此操作的所有充分原因。但是,例如,作为测试套件,调试工具或其他与python内部相关的程序的一部分,这可能会有所帮助。

大致从https://gist.github.com/liuw/2407154解除了

import ctypes

def ctype_async_raise(target_tid, exception):
ret = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(target_tid), ctypes.py_object(exception))
# ref: http://docs.python.org/c-api/init.html#PyThreadState_SetAsyncExc
if ret == 0:
raise ValueError("Invalid thread ID")
elif ret > 1:
# Huh? Why would we notify more than one threads?
# Because we punch a hole into C level interpreter.
# So it is better to clean up the mess.
ctypes.pythonapi.PyThreadState_SetAsyncExc(target_tid, NULL)
raise SystemError("PyThreadState_SetAsyncExc failed")

关于multithreading - 将异常抛出到另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36484151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com