是不是因为你这些线程都设置成守护线程,另外问一下这些线程对象激活的时候都是空任务,是不是queue.join()会给所有所动对象发信号激活。
发送自 Windows 10 版邮件应用
发件人: chao jay
发送时间: Wednesday, January 15, 2020 2:38 PM
收件人: python-cn(华蟒用户组,CPyUG 邮件列表)
主题: [CPyUG] python多线程队列下载文件,为什么内存会一直增长不释放
我发布在stackoverflow的问题地址: https://stackoverflow.com/questions/59746125/memory-keep-growing-when-using-mutil-thread-download-file
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/85c9d935-4297-452c-bb46-0b56784a8c01%40googlegroups.com。
我看了一下Queue库的文档 调用空队列会默认阻塞的当你加入新任务然后激活,其实一开始在那个node处就阻塞了。如果有问题我估计是因为你设置那些线程为守护进程,所以任务完成以后线程对象不释放,可以把这行代码屏蔽试试t.daemon = True,默认是False
我看了一下Queue库的文档 调用空队列会默认阻塞的当你加入新任务然后激活,其实一开始在那个node处就阻塞了。如果有问题我估计是因为你设置那些线程为守护进程,所以任务完成以后线程对象不释放,可以把这行代码屏蔽试试t.daemon = True,默认是False
发送自 Windows 10 版邮件应用
发件人: chao jay
发送时间: Wednesday, January 15, 2020 2:38 PM
收件人: python-cn(华蟒用户组,CPyUG 邮件列表)
主题: [CPyUG] python多线程队列下载文件,为什么内存会一直增长不释放
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/85c9d935-4297-452c-bb46-0b56784a8c01%40googlegroups.com。
我看了一下Queue库的文档 调用空队列会默认阻塞的当你加入新任务然后激活,其实一开始在那个node处就阻塞了。如果有问题我估计是因为你设置那些线程为守护进程,所以任务完成以后线程对象不释放,可以把这行代码屏蔽试试t.daemon = True,默认是False
发送自 Windows 10 版邮件应用
发件人: chao jay
发送时间: Wednesday, January 15, 2020 2:38 PM
收件人: python-cn(华蟒用户组,CPyUG 邮件列表)
主题: [CPyUG] python多线程队列下载文件,为什么内存会一直增长不释放
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/85c9d935-4297-452c-bb46-0b56784a8c01%40googlegroups.com。
我发布在stackoverflow的问题地址: https://stackoverflow.com/questions/59746125/memory-keep-growing-when-using-mutil-thread-download-file--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/85c9d935-4297-452c-bb46-0b56784a8c01%40googlegroups.com。
那肯定啊,你那个下载过程,下载的文件又没有放到磁盘上面去了,就一个return,其实相当于你从网路上一直打开文件到内存。那些线程也不会自动施放,阻塞在queue.get(),所以那些文件的打开线程一直都隐形存在也不会自动施放。不知道我猜的对不对,你可以在queue队列空了的时候,回收所有线程试试。
发送自 Windows 10 版邮件应用
发件人: Jing Liu
发送时间: Thursday, January 16, 2020 4:06 AM
收件人: python-cn:CPyUG
主题: Re: [CPyUG] python多线程队列下载文件,为什么内存会一直增长不释放
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/5e1fb6c9.1c69fb81.2f1ae.3753%40mx.google.com。
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com。
要在网络上查看此讨论,请访问 https://groups.google.com/d/msgid/python-cn/20200116065508.GA304176%40lilyforest.localdomain。
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/CADq5vF4%2B-LAcfzM5afcSUXg0WR232uFoPux6WnMa9%3D5OnEB4Yg%40mail.gmail.com。
这个光猜不行,最好自己测试一下。
那个探测编码我觉得不是,r.txt 已经给明了字符编码,然后会根据系统默认编码,编码正确和错误是人的主观问题,对计算机没有什么意义,而且出错的话,python的异常处理程序,或者操作系统会终止程序。
还有我对那个内存一直增长的问题不是很清楚,这个代码我没运行过,每个进程有内存使用限制,超过了系统会自动终止程序吧。这个程序是不是因为异常直接被关掉了,还是运行中会占用了很多的内存,然后施放了。
首先看看线程有没有施放(测试方法reput some elements into The queue, 看看线程队列还在不在,如果在,那就很可能下载的对象被当做一个临时文件对象存贮,线程关闭之前就算没有引用文件也不会关闭,但是这个对象如果是存放在stack中的话返回时会自动施放,但是这里有可能是存放在堆中的,因为下载对象可能在返回以后还需要用,所有一般文件打开需要调用一个close()。文件对象被回收有两个条件 1 对象引用数0, 打开线程关闭,临时文件一搬就是先创建一个文件,然后unlink实现的,这样进程关闭临时文件会自动被关闭。
主要我还没有弄清楚你的问题,这些就当练练打字吧。
发送自 Windows 10 版邮件应用
发件人: Jing Liu
发送时间: Monday, January 20, 2020 11:32 AM
收件人: python-cn:CPyUG
主题: Re: [CPyUG] python多线程队列下载文件,为什么内存会一直增长不释放
你调用 r.text 的时候,就相当于要求 requests 把下载的数据解码,变成一个字符串。
你在搞笑吗?下载的文件全放在内存里,你下载一个10G的文件就占用10G的内存?明显是在内存里打开一个流,和一个临时文件关联起来。Cpython,只是翻译一下代码罢了,还不是一样调用操作系统的系统调用,以及对文件对象的管理不管是为了兼容还是简便我觉得都是委托操作系统管理的。还有我说那个探测编码,你都没懂我的逻辑。我说如果探测错误,线程就会被关闭。如果没有被关闭,就说明和探测编码没有什么关系。我说的默认的编码,那个探测编码是不是一个一个编码去试?英语也好,日语也好,中文也好或者一堆乱码对计算机有区别吧?他怎么知道你要那个?一般你不指定,就是默认UTF-8.
发送自 Windows 10 版邮件应用
发件人: Jing Liu
发送时间: Monday, January 20, 2020 2:55 PM