加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 多处理和垃圾回收

发布时间:2020-12-16 23:36:15 所属栏目:Python 来源:网络整理
导读:在py2.6中,多处理模块提供了一个Pool类,所以可以做到: class Volatile(object): def do_stuff(self,...): pool = multiprocessing.Pool() return pool.imap(...) 然而,使用2.7.2的标准Python实现,这种方法很快将导致“IOError:[Errno 24]打开的文件太多”.
在py2.6中,多处理模块提供了一个Pool类,所以可以做到:
class Volatile(object):
    def do_stuff(self,...):
        pool = multiprocessing.Pool()
        return pool.imap(...)

然而,使用2.7.2的标准Python实现,这种方法很快将导致“IOError:[Errno 24]打开的文件太多”.显然,池对象从来没有收到垃圾回收,所以它的进程永远不会终止,累积任何内部打开的描述符.我认为这是因为以下工作:

class Volatile(object):
    def do_stuff(self,...):
        pool = multiprocessing.Pool()
        result = pool.map(...)
        pool.terminate()
        return result

我想保持imap的“懒惰”迭代器方法;在这种情况下垃圾收集工作如何工作?如何修复代码?

解决方法

最后,我结束了传递池参考,并在pool.imap迭代器完成后手动终止它:
class Volatile(object):
    def do_stuff(self,...):
        pool = multiprocessing.Pool()
        return pool,pool.imap(...)

    def call_stuff(self):
        pool,results = self.do_stuff()
        for result in results:
            # lazy evaluation of the imap
        pool.terminate()

如果将来有人绊倒这个解决方案:在pool.imap中,chunksize参数是非常重要的(而不是简单的Pool.map,它没有关系).我手动设置它,以便每个进程接收1 len(输入)/ len(池)作业.离开它的默认chunksize = 1给了我一样的表现,好像我没有使用并行处理…坏.

我想使用有序的imap和有序地图没有真正的好处,我只是个人喜欢迭代器更好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读