资讯专栏INFORMATION COLUMN

python multiprocess 使用 yield

刘东 / 2407人阅读

摘要:实际是先将全部消费掉放到中。这样是解决了使用来并行。但是依然没有解决占用内存的问题。解决第二个问题,可以通过来达到示例代码如下使用注意事项。在数据的时候,尽量少做操作,应为即使是也是单线程的来消费数据。这样才能更好的利用多进程提高效率。

python在处理数据的时候,memory-heavy 的数据往往会导致程序没办反运行或者运行期间服务器其他程序效率受到影响。这种情况往往会把数据集合变为通过genertor来遍历。

但同时如我们所知,generoter看似只能被单进程消费,这样效率很低。

generator 可以被pool.map消费。

看一下pool.py的源码。

for i, task in enumerate(taskseq):
     ...
     try:
         put(task)
     except IOError:
         debug("could not put task on queue")
         break

实际是先将generator全部消费掉放到queue中。然后通过map来并行。这样是解决了使用map来并行。

但是依然没有解决占用内存的问题。这里有两步占用内存。

第一步是全部消费掉的generator。

第二步并行运算全部data。

解决第一个问题,通过部分消费generator来达到。
解决第二个问题,可以通过imap来达到.

示例代码如下:

import multiprocessing as mp
import itertools
import time


def g():
    for el in xrange(50):
        print el
        yield el

import os

def f(x):
    time.sleep(1)
    print str(os.getpid()) +" "+  str(x)
    return x * x

if __name__ == "__main__":
    pool = mp.Pool(processes=4)              # start 4 worker processes
    go = g()
    result = []
    N = 11
    while True:
        g2 = pool.imap(f, itertools.islice(go, N))
        if g2:
            for i in g2:
                result.append(i)
                time.sleep(1)
        else:
            break
    print(result)

ps: 使用注意事项。在produce数据的时候,尽量少做操作,应为即使是map也是单线程的来消费数据。所以尽量把操作放到map中作。这样才能更好的利用多进程提高效率。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37568.html

相关文章

  • 经验拾忆(纯手工)=> Python三程

    摘要:多线程对于爬虫方面也可以表现出较好的性能。计算密集型就别想多线程了,一律多进程。所以同一时刻最大的并行线程数进程数的核数这条我的个人理解很模糊,参考吧多线程多线程有种通过的那种方式,非常普遍,此处就不写了。 GIL的理解 GIL这个话题至今也是个争议较多的,对于不用应用场景对线程的需求也就不同,说下我听过的优点: 1. 我没有用过其他语言的多线程,所以无法比较什么,但是对于I/O而言,...

    Snailclimb 评论0 收藏0
  • Python 面试」第三次更新

    摘要:说一下进程线程以及多任务多进程多线程和协程进程概念一个程序对应一个进程,这个进程被叫做主进程,而一个主进程下面还有许多子进程。避免了由于系统在处理多进程或者多线程时,切换任务时需要的等待时间。 showImg(https://segmentfault.com/img/bVbuYxg?w=3484&h=2480); 阅读本文大约需要 10 分钟。 14.说一下进程、线程、以及多任务(多进...

    wslongchen 评论0 收藏0
  • python正则表达式简单爬虫入门+案例(爬取猫眼电影TOP榜)

    摘要:用迭代进行异步操作保存写入文件配置启动函数使用多进程加速一秒完成 用正则表达式实现一个简单的小爬虫 常用方法介绍 1、导入工具包 import requests #导入请求模块 from flask import json #导入json模块 from requests.exceptions import RequestException #异常捕捉模块 import re #导入正则...

    xiaowugui666 评论0 收藏0
  • Python 中 Ctrl+C 不能终止 Multiprocessing Pool 的解决方案

    摘要:解决方法有两种。代码然而这段代码只有在运行在处的时候才能用中断,即前你按有效,一旦后则完全无效建议先确认是否真的需要用到多进程,如果是多的程序建议用多线程或协程,计算特别多则用多进程。 本文理论上对multiprocessing.dummy的Pool同样有效。 python2.x中multiprocessing提供的基于函数进程池,join后陷入内核态,按下ctrl+c不能停止所有的进...

    lmxdawn 评论0 收藏0
  • python学习笔记 - fork, multiprocessing

    摘要:近年来,人工智能的兴起使得更加火爆了。获取当前进程父进程的。但是唯一遗憾的是,函数只能在系统中使用,不能在系统中使用。因此在下,需要将其包含在中。则是立即返回一个可迭代对象。则是返回可迭代函数。 Python一直是一门对初学者非常友好的语言,在数据分析、Web 开发、网络安全、网络爬虫等方面应用广泛。近年来,人工智能的兴起使得 Python 更加火爆了。 我们在处理大量数据或者需要快速...

    littleGrow 评论0 收藏0

发表评论

0条评论

刘东

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<