Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python是否与Haskell';s';面具';或';括号';功能?_Python_Haskell_Asynchronous_Exception Handling - Fatal编程技术网

Python是否与Haskell';s';面具';或';括号';功能?

Python是否与Haskell';s';面具';或';括号';功能?,python,haskell,asynchronous,exception-handling,Python,Haskell,Asynchronous,Exception Handling,在Haskell中,我们有异步异常;我们可以使用在另一个线程中引发任何异常: throwTo在目标线程中引发任意异常(仅限GHC) 为了能够编写具有保证的代码,如“在获取锁后将始终释放锁”,我们必须运行只有在计算阻塞时才能接收异步异常的代码: 在屏蔽异步异常的情况下执行IO计算。也就是说,任何试图在当前线程中使用throwTo引发异常的线程都将被阻止,直到异步异常再次被揭穿 以及一种更强的方法,在屏蔽计算过程中根本不会引发异步异常: 类似于掩码,但掩码计算是不可中断的 掩蔽用于实现更高级别的抽象

在Haskell中,我们有异步异常;我们可以使用在另一个线程中引发任何异常:

throwTo
在目标线程中引发任意异常(仅限GHC)

为了能够编写具有保证的代码,如“在获取锁后将始终释放锁”,我们必须运行只有在计算阻塞时才能接收异步异常的代码:

在屏蔽异步异常的情况下执行IO计算。也就是说,任何试图在当前线程中使用
throwTo
引发异常的线程都将被阻止,直到异步异常再次被揭穿

以及一种更强的方法,在屏蔽计算过程中根本不会引发异步异常:

类似于
掩码
,但掩码计算是不可中断的

掩蔽用于实现更高级别的抽象,如:

当您想要获取资源时,先对其进行一些处理,然后释放资源,最好使用
括号
,因为
括号
将安装必要的异常处理程序,以便在计算期间引发异常时释放资源。如果引发异常,则
括号
将重新引发异常(执行释放后)

如果我理解正确的话,Python有一种(不太通用的)异步异常形式,最显著的表现形式是:

当用户点击中断键(通常为Control-C或Delete)时引发。在执行过程中,定期检查中断情况

文档对“检查中断”何时发生并不精确,但似乎暗示在程序执行的任何时候都可能引发
键盘中断。因此,Python的异步异常似乎在维护正确性方面遇到了同样微妙的困难

例如,考虑这样的模式:

x = None
try:
    x = acquire()
    do_something(x)    # (1)
finally:
    if x is not None:  # (2)
        release(x)
如果在
(1)
期间引发任何异常,则我们确信将执行该块的内容。但是如果
键盘中断发生在
(2)
期间,会发生什么情况


在存在asyc异常的情况下,如果不屏蔽它们,似乎根本不可能保证资源清理。是否有一些工具用于此,或者我们是否依赖于上下文管理器?

这就是上下文管理器的用途

with acquire() as x:
    do_something(x)

acquire
返回一个对象,该对象的类型定义了一个
\uuuuuuuuuuuuuuuuuuu enter\uuuuuuuu
方法,该方法返回绑定到
x
的值和一个
\uuuuuuuuuuuuuuuuuuuuuu退出
方法,无论语句是如何退出的,
都会在
语句末尾执行。

我想如果你想这样做,你几乎必须为Ctrl-C安装自己的信号处理程序。如果发生进一步的异常,
\uuuuuuuuuuuuu
方法会被中断吗?@DanielWagner我在写这篇文章时的模糊记忆Python:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;提示
\uuuuuu exit\uuuuu
块的异常将成为后一个异常的
\uuuu原因\uuuuu
,并在退出之前还原以前的处理程序。相同的问题:信号处理程序的执行是否会被另一个信号中断?
uninterruptibleMask :: ((forall a. IO a -> IO a) -> IO b) -> IO b
bracket
    :: IO a         -- computation to run first ("acquire resource")
    -> (a -> IO b)  -- computation to run last ("release resource")
    -> (a -> IO c)  -- computation to run in-between
    -> IO c         -- returns the value from the in-between computation
x = None
try:
    x = acquire()
    do_something(x)    # (1)
finally:
    if x is not None:  # (2)
        release(x)
with acquire() as x:
    do_something(x)