摘要:實(shí)際是先將全部消費(fèi)掉放到中。這樣是解決了使用來并行。但是依然沒有解決占用內(nèi)存的問題。解決第二個(gè)問題,可以通過來達(dá)到示例代碼如下使用注意事項(xiàng)。在數(shù)據(jù)的時(shí)候,盡量少做操作,應(yīng)為即使是也是單線程的來消費(fèi)數(shù)據(jù)。這樣才能更好的利用多進(jìn)程提高效率。
python在處理數(shù)據(jù)的時(shí)候,memory-heavy 的數(shù)據(jù)往往會(huì)導(dǎo)致程序沒辦反運(yùn)行或者運(yùn)行期間服務(wù)器其他程序效率受到影響。這種情況往往會(huì)把數(shù)據(jù)集合變?yōu)橥ㄟ^genertor來遍歷。
但同時(shí)如我們所知,generoter看似只能被單進(jìn)程消費(fèi),這樣效率很低。
generator 可以被pool.map消費(fèi)。看一下pool.py的源碼。
for i, task in enumerate(taskseq): ... try: put(task) except IOError: debug("could not put task on queue") break
實(shí)際是先將generator全部消費(fèi)掉放到queue中。然后通過map來并行。這樣是解決了使用map來并行。
但是依然沒有解決占用內(nèi)存的問題。這里有兩步占用內(nèi)存。
第一步是全部消費(fèi)掉的generator。
第二步并行運(yùn)算全部data。
解決第一個(gè)問題,通過部分消費(fèi)generator來達(dá)到。
解決第二個(gè)問題,可以通過imap來達(dá)到.
示例代碼如下:
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: 使用注意事項(xiàng)。在produce數(shù)據(jù)的時(shí)候,盡量少做操作,應(yīng)為即使是map也是單線程的來消費(fèi)數(shù)據(jù)。所以盡量把操作放到map中作。這樣才能更好的利用多進(jìn)程提高效率。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37568.html
摘要:多線程對(duì)于爬蟲方面也可以表現(xiàn)出較好的性能。計(jì)算密集型就別想多線程了,一律多進(jìn)程。所以同一時(shí)刻最大的并行線程數(shù)進(jìn)程數(shù)的核數(shù)這條我的個(gè)人理解很模糊,參考吧多線程多線程有種通過的那種方式,非常普遍,此處就不寫了。 GIL的理解 GIL這個(gè)話題至今也是個(gè)爭(zhēng)議較多的,對(duì)于不用應(yīng)用場(chǎng)景對(duì)線程的需求也就不同,說下我聽過的優(yōu)點(diǎn): 1. 我沒有用過其他語言的多線程,所以無法比較什么,但是對(duì)于I/O而言,...
摘要:說一下進(jìn)程線程以及多任務(wù)多進(jìn)程多線程和協(xié)程進(jìn)程概念一個(gè)程序?qū)?yīng)一個(gè)進(jìn)程,這個(gè)進(jìn)程被叫做主進(jìn)程,而一個(gè)主進(jìn)程下面還有許多子進(jìn)程。避免了由于系統(tǒng)在處理多進(jìn)程或者多線程時(shí),切換任務(wù)時(shí)需要的等待時(shí)間。 showImg(https://segmentfault.com/img/bVbuYxg?w=3484&h=2480); 閱讀本文大約需要 10 分鐘。 14.說一下進(jìn)程、線程、以及多任務(wù)(多進(jìn)...
摘要:用迭代進(jìn)行異步操作保存寫入文件配置啟動(dòng)函數(shù)使用多進(jìn)程加速一秒完成 用正則表達(dá)式實(shí)現(xiàn)一個(gè)簡(jiǎn)單的小爬蟲 常用方法介紹 1、導(dǎo)入工具包 import requests #導(dǎo)入請(qǐng)求模塊 from flask import json #導(dǎo)入json模塊 from requests.exceptions import RequestException #異常捕捉模塊 import re #導(dǎo)入正則...
摘要:解決方法有兩種。代碼然而這段代碼只有在運(yùn)行在處的時(shí)候才能用中斷,即前你按有效,一旦后則完全無效建議先確認(rèn)是否真的需要用到多進(jìn)程,如果是多的程序建議用多線程或協(xié)程,計(jì)算特別多則用多進(jìn)程。 本文理論上對(duì)multiprocessing.dummy的Pool同樣有效。 python2.x中multiprocessing提供的基于函數(shù)進(jìn)程池,join后陷入內(nèi)核態(tài),按下ctrl+c不能停止所有的進(jìn)...
摘要:近年來,人工智能的興起使得更加火爆了。獲取當(dāng)前進(jìn)程父進(jìn)程的。但是唯一遺憾的是,函數(shù)只能在系統(tǒng)中使用,不能在系統(tǒng)中使用。因此在下,需要將其包含在中。則是立即返回一個(gè)可迭代對(duì)象。則是返回可迭代函數(shù)。 Python一直是一門對(duì)初學(xué)者非常友好的語言,在數(shù)據(jù)分析、Web 開發(fā)、網(wǎng)絡(luò)安全、網(wǎng)絡(luò)爬蟲等方面應(yīng)用廣泛。近年來,人工智能的興起使得 Python 更加火爆了。 我們?cè)谔幚泶罅繑?shù)據(jù)或者需要快速...
閱讀 912·2021-09-22 15:17
閱讀 1949·2021-09-22 15:06
閱讀 2231·2021-09-08 09:35
閱讀 5119·2021-09-01 11:43
閱讀 3488·2019-08-30 15:55
閱讀 2162·2019-08-30 12:48
閱讀 3163·2019-08-30 12:45
閱讀 1792·2019-08-29 17:31