垃圾收集器和线程

大家好, 我刚刚发现,如果我错了,就纠正了我,只要一个 螺纹.线程正在运行,其破坏者不会被调用,因为 它指的是他自己. 因此,如果我有类似的东西: 类mythread(螺纹螺纹): def __init __(自我): self.cancelevent = threading.event() 螺纹.__ init __(self) def __del __(self): self.cancel() def run(self): self.cancelevent.wait() def取消(self): self.cancelevent.set() 如果我希望击曲率为 打电话(请注意,我不想要Deamon线程). 我可以做一个包装纸 超过螺纹.直接有我想要的行为:有一个线程 __del__当另一线程不引用它时调用. 但是我的 问题是,我根本没有这个问题的整体愿景, 那应该是默认行为吗? 问候, 尼古拉斯

# 回答1

在文章中 nicolas fleury 写道: 是的,不要那样做. 不要依靠最终化来用于外部资源 (例如线程). 请注意,您对Python的内存管理的理解可能会使用一些 改进:GC *永不 *在包含__del__的对象上运行 - - aahz(aaxpythoncraft.com)<*> http://www.pythoncraft.com/ "不要嘲笑循环的快乐乐趣.不要更改循环的清单." -Remco Gerlich,comp.lang.python
# 回答2

阿赫兹写道: 好吧,我想你是对的. 我的意思是通话背后的原因 到__DEL__,无论它是涉及的或其他内容. 不会 诸如cancellablethread之类的类,带有子级实现的取消方法 当对象未在任何其他线程中引用时称为有用吗? 问候, 尼古拉斯
# 回答3

在文章<1E ************************************************************************************************************* nicolas fleury 写道:为什么? 不适用于Python吗? 什么是" raii"? 好吧,我想你是对的. 我的意思是callto __del__背后的原因,无论它是涉及的还是其他. 当对象未在任何其他线程中引用对象时,是否会像cancellablethread这样的Aclass cancellablethread进行取消方法? 也许,但是线程需要参考创建线程的参考,以便 实施其功能. 您可以尝试构建自己的线程 直接使用``线程''构造. - - aahz(aaxpythoncraft.com)<*> http://www.pythoncraft.com/ "不要嘲笑循环的快乐乐趣.不要更改循环的清单." -Remco Gerlich,comp.lang.python
# 回答4

aa@pythoncraft.com(aahz)写道:为什么? 不适用于Python吗? 什么是" raii"? 资源育种是初始化. 在C ++中工作. 不是真的 在Python. 干杯, MWH - - 需要知道通常是一个有趣的英国摘要 发生在上周或下周发生. [...] 本星期, 什么都没有发生,我们不在乎. -NTK NOW,2000-12-29,http://www.ntk.net/
# 回答5

阿赫兹写道: "资源获取是初始化" 这是C ++中经常使用的术语来描述构造函数的使用 以及用于资源分配/交易的驱动器. 也许,但是线程需要引用对创建线程的参考,以实现其功能. 您可以直接尝试使用``线程''构建自己的线程构造. 我仍然不知道如何实施它. 我可以做一些非常简单的事情 喜欢: 类癌症: def __init __(自我,线程): self.thread =线程 def __del __(self): self.thread.cancel() self.thread.join() 但是我不能将概念与线程类合并,因为自我 通过运行将是对对象的引用...我不知道是否a 语言扩展将是值得的,或者如果有酷的话 我缺少的解决方案,但是可以肯定的是,我为 在父对象的最终化中取消线程. 我不要戴蒙 线程使一切都被干净地停止,但与此同时 在GUI应用程序中容易出错,因为我有可能拥有该过程 仍在退出之后运行. 我只想要一种方法来garantee,当我所有的线程都取消 主线程完成. 问候, 尼古拉斯
# 回答6

在文章<6U *******************@nnrp1.uunet.ca>中 nicolas fleury 写道: 正如迈克尔·哈德森(Michael Hudson)所说的那样,它在python中行不通,因为所有人 Python对象是全局的(我的意思是在这里真正的全球,而不仅仅是模块 全球的). 本质上,所有对象都是可以追踪的堆对象 通过爬行Python的内部. 我仍然不知道如何实施它. 我可以做一些非常简单的事情:类canceller:def __init __(self,thread):self.thread = thread def def __del __(self):self.thread.cancel()self.thread.join(),但我不能合并 带有线程类的概念,因为自行车运行将是对对象的引用...我不知道流动扩展是否值得付出努力,或者我缺少的是很酷,但是肯定是 我在父对象的最终化器中写了很多代码tocancel线程. 我不想要deamonthreads,以便所有内容都被干净地停止,但与此同时,ITIS在GUI应用程序中容易出错,因为我有可能在退出后将ProcessStill运行. 正确的. 正如我所说,您必须直接使用``线程''模块; 你 无法使用``线程''. 我只想一种方法来garantee,当它们完成时,我的所有线程都会取消. 因此,请保留对他们的引用,然后称``cancel()``您的方法''. - - aahz(aaxpythoncraft.com)<*> http://www.pythoncraft.com/ "不要嘲笑循环的快乐乐趣.不要更改循环的清单." -Remco Gerlich,comp.lang.python
# 回答7

阿赫兹写道: 但是,即使我使用"线程",我也无法将功能放入 如果我想访问运行线程中的成员,则一个类. 因此,请参考他们 nd调用``cancel()``您自己的方法''. 这是一个可能的解决方案. 用取消做自定义线程类 方法以及所有在某处注册的实例. 在 主线程,我打电话给某些东西以取消所有这些线程. 有 但是该解决方案的一些问题: - 在孩子线程之前,需要取消父螺纹. - 它仅在主线程的末端工作; 它不能在 应用中间. - 取消不是自动的(我想有一种方法可以通过 无论如何,要覆盖出口之类的东西...) 通过将RAII与Canceller I类一起解决所有这些问题 在上一条消息中显示,因此我更喜欢使用此解决方案. 实际上, 我真正需要的是一种机制,我不知道是否有 已经一个,以禁用其螺纹对象中的参考计数 相应的线程,以便我可以为 可取消线程. 问候, 尼古拉斯
# 回答8

在文章中 nicolas fleury 写道: 嗯? 我不明白你的意思. 因此,请保留对它们的引用,然后调用``cancel()``您的方法''.这是一个可能的解决方案. 用取消方法进行自定义线程类,并在所有实例中注册. 在它们的末尾,我称之为取消所有这些线程的东西. 在该解决方案上发现了一些问题: - 父程线程需要在孩子线程之前取消. 为什么这是一个问题? 只需在 主线程和级联取消. - 它仅在主线程的末端工作; 它不能在应用程序的主题上使用. 为什么? - - aahz(aaxpythoncraft.com)<*> http://www.pythoncraft.com/ "不要嘲笑循环的快乐乐趣.不要更改循环的清单." -Remco Gerlich,comp.lang.python
# 回答9

阿赫兹写道:嗯? 我不明白你的意思. 好吧,假设我想参加一个具有相同接口的课程 线程.但是有两个添加: comcellablethread类: def __del __(self):self.cancel() 第一个添加是最终化器使用实现的子类 取消线程的机制. 第二个添加是,一旦对象未转介 在父线程中,线程对象已完成. 请注意,它不需要成为终结者,必要的是 当对象不再引用父时,要称呼它 线. 我是说我不知道有什么方法可以通过一个班级做到这一点, 因为我希望子类能够定义类似的内容: def run(self) 并且线程对象将通过" self"在运行线程中引用 所以我没有任何办法知道线程对象何时不知道 在主线程中引用. 我可以做类似的事情: 类癌症: def __init __(self,thread):self.thread =线程 def __del __(self):self.thread.cancel( ) 这样我将所有线程用" canceller"封装在父母中 线程,但是然后我必须在作业中使用两个对象 可能是由一个人完成的. 为什么这是一个问题? 只需在主线程中保留对父螺纹的引用,然后降低了clase的clasce. 您是对的,它有效. 目前我写道,我期望混合 通过这种机制实现的取消列表类别 线程类导致线程之间的链接丢失. 如果发生这种情况 所有不是dancellablethreads的线程(如主线程)必须 调用该功能以取消剩余的dancellableThreads启动 直接由他们. 为什么? 因为目标是取消不再引用的线程 主线程. 由于无法知道它们是哪个,所以没有 在应用程序中间进行操作的方法. 你必须在 主线程的结尾,与其他线程一样,您可以假设 可取消线程应取消并连接. 我不知道我对正在搜索的内容的说明是否更清楚. 我 有没有语言扩展的感觉不可能做到 与此同时,它比错误少于 线程.是否为deamons. 也许我可以为 练习... 问候, 尼古拉斯

标签: python

添加新评论