1 
                    
                    t133      2023-10-06 12:30:00 +08:00 via iPhone 
                    
                    使用 with tempfile 这种试试? 
                 | 
            
     2 
                    
                    aijam      2023-10-06 12:34:08 +08:00 
                    
                    +1 用 with 
                 | 
            
     3 
                    
                    ysc3839      2023-10-06 12:39:09 +08:00 via Android 
                    
                    gc 语言就是不确定释放时机的,因此不能用 C++的 RAII 这种写法,只能用语言提供的 with 等机制。 
                 | 
            
     4 
                    
                    vituralfuture      2023-10-06 12:42:58 +08:00 
                    
                    GC 是无法确定时机的,不一定是立刻释放,往往是内存占用达到阈值了或者满足其他条件了才会开始 GC 
                参考 https://docs.python.org/3/library/gc.html ,可以看看 python 提供的 GC 接口,可以调试 GC ,也可以立刻调用 GC 另外还可以把清理资源这些操作放到 run 函数末尾  | 
            
     5 
                    
                    BBCCBB      2023-10-06 12:57:15 +08:00 
                    
                    使用者必须得保证正确释放, 不然就没法完了. 文件, io 流都是这样的..  
                直接用 with/try finally.  | 
            
     6 
                    
                    julyclyde      2023-10-06 16:21:43 +08:00 
                    
                    run 函数末尾试试 del task 
                 | 
            
     7 
                    
                    ch2      2023-10-06 19:04:56 +08:00 
                    
                    暴露一个 cleanup 函数出去吧 
                 | 
            
     8 
                    
                    nowheremanx   OP @julyclyde del task 也不一定有用,因为 GC 并不会立即释放。而且 python 中各种引用太复杂了,可能无法保证 reference 为 0 。 最令我震惊的是,程序结束之后,有些文件也不会释放。 
                 | 
            
     9 
                    
                    nowheremanx   OP @ch2 是的,只能要求用户手动 cleanup 。  如果没有 cleanup 直接结束的话,扔一个 warning 好了。这是目前想到的方案,类似于 http 客户端或者数据库客户端的 behaviour 。 
                 | 
            
     10 
                    
                    dayeye2006199      2023-10-07 07:48:18 +08:00 via Android 
                    
                    弄成一个 contextmanger ,清理逻辑显式写在里面 
                 | 
            
     11 
                    
                    nowheremanx   OP @dayeye2006199 这个是正要加的 feature ,但是我个人不是很喜欢 with ,代码块都要右移,所以最早的时候用__del__帮忙解决资源回收。这才踩坑了 
                 | 
            
     12 
                    
                    Maerd      2023-10-07 11:38:25 +08:00 
                    
                    我很好奇为什么你认为让 gc 来“帮”你清除文件是合理的,并且还预想程序崩溃时也能自动清理,这在任何语言中都是不可靠的操作,对于文件操作我们应该手动去处理。 
                一般来说,python 中的临时文件都是使用 tempfile 模块来管理,tempfile 会自动在程序退出的时候删除文件  | 
            
     13 
                    
                    julyclyde      2023-10-07 12:18:53 +08:00 
                    
                    @nowheremanx gc 不 *立即* 释放,是很可以理解的。手工 del 可以“提醒”在可做可不做的情况下,让他去做。但至于说引用数没有降到 0 ,那可能是你自己需要解决的问题了 
                至于程序结束后还没释放……可能是 bug ??  | 
            
     14 
                    
                    julyclyde      2023-10-07 12:19:21 +08:00 
                    
                    @nowheremanx 哈哈哈代码块右移,好像是 python 被人诟病的问题之一,就是随便加点啥就右移很远了 
                 | 
            
     16 
                    
                    Maerd      2023-10-07 15:05:21 +08:00 
                    
                    @julyclyde 哦这点是我说错了,tempfile 的清理是 context manager 结束或者关闭临时文件对象后会删除,这样免除了手动删除一次的问题 
                 | 
            
     18 
                    
                    bianhui      2023-10-08 09:20:05 +08:00 
                    
                    首先,系统 gc 就不应该要去尝试控制。提供一个 clean 方法或者上下文管理器就行了,别老想着 pua 别的程序员,open 函数也不一定有人全部记得 close 。不会是所有的事情都要拦在自己身上。别人写不好是别人的事,就算是上下文管理器,别人也可以直接通过__enter__去调用。把自己的 api 构建好就行了。 
                 | 
            
     20 
                    
                    julyclyde      2023-10-08 12:42:16 +08:00 
                    
                    @Maerd Under Unix, the directory entry for the file is either not created at all or is removed immediately after the file is created. Other platforms do not support this; your code should not rely on a temporary file created using this function having or not having a visible name in the file system. 
                大概是 deleted immediately 的方法。学习了  |