Python 進程池

來源:互聯網
上載者:User

標籤:pid   多個   pip   cep   request   並發   war   垃圾   from   

一、定義:

  多進程是實現並發的手段之一,在利用Python進行系統管理的時候,特別是同時操作多個檔案目錄,或者遠端控制多台主機,並行操作可以節約大量的時間。                      Pool([numprocess [,initializer [, initargs]]]):建立進程池 

二、主要參數:

  1 numprocess:要建立的進程數,如果省略,將預設使用cpu_count()的值  2 initializer:是每個背景工作處理序啟動時要執行的可調用對象,預設為None  3 initargs:是要傳給initializer的參數組

三、主要方法:

p.apply(func [, args [, kwargs]]):在一個池背景工作處理序中執行func(*args,**kwargs),然後返回結果。需要強調的是:此操作並不會在所有池背景工作處理序中並執行func函數。如果要通過不同參數並發地執行func函數,必須從不同線程調用p.apply()函數或者使用p.apply_async()p.apply_async(func [, args [, kwargs]]):在一個池背景工作處理序中執行func(*args,**kwargs),然後返回結果。此方法的結果是AsyncResult類的執行個體,callback是可調用對象,接收輸入參數。當func的結果變為可用時,將理解傳遞給callback。callback禁止執行任何阻塞操作,否則將接收其他非同步作業中的結果。   p.close():關閉進程池,防止進一步操作。如果所有操作持續掛起,它們將在背景工作處理序終止前完成P.jion():等待所有背景工作處理序退出。此方法只能在close()或teminate()之後調用

四、其它方法:

方法apply_async()和map_async()的傳回值是AsyncResul的執行個體obj。執行個體具有以下方法obj.get():返回結果,如果有必要則等待結果到達。timeout是可選的。如果在指定時間內還沒有到達,將引發一場。如果遠程操作中引發了異常,它將在調用此方法時再次被引發。obj.ready():如果調用完成,返回Trueobj.successful():如果調用完成且沒有引發異常,返回True,如果在結果就緒之前調用此方法,引發異常obj.wait([timeout]):等待結果變為可用。obj.terminate():立即終止所有背景工作處理序,同時不執行任何清理或結束任何掛起工作。如果p被記憶體回收,將自動調用此函數

五、執行個體:

from multiprocessing import Poolimport os,timedef work(n):    print(‘task <%s> is runing‘ %os.getpid())    time.sleep(2)    return n**2if __name__ == ‘__main__‘:    # print(os.cpu_count())    p=Pool(4) # 並存執行幾個進程    # for i in range(10):    #     res=p.apply(work,args=(i,))    #     print(res)    res_l=[]    for i in range(10):        res=p.apply_async(work,args=(i,))        res_l.append(res)    p.close()    p.join()    #    # for res in res_l:    #     print(res.get())

六、回呼函數:

import requests #pip3 install requestsimport os,timefrom multiprocessing import Pooldef get_page(url):    print(‘<%s> get :%s‘ %(os.getpid(),url))    respone = requests.get(url)    if respone.status_code == 200:        return {‘url‘:url,‘text‘:respone.text}def parse_page(dic):    print(‘<%s> parse :%s‘ %(os.getpid(),dic[‘url‘]))    time.sleep(0.5)    res=‘url:%s size:%s\n‘ %(dic[‘url‘],len(dic[‘text‘])) #類比解析網頁內容    with open(‘db.txt‘,‘a‘) as f:        f.write(res)if __name__ == ‘__main__‘:    p=Pool(4)    urls = [        ‘http://www.baidu.com‘,        ‘http://www.baidu.com‘,        ‘http://www.baidu.com‘,        ‘http://www.baidu.com‘,        ‘http://www.baidu.com‘,        ‘http://www.baidu.com‘,        ‘http://www.baidu.com‘,    ]    for url in urls:        p.apply_async(get_page,args=(url,),callback=parse_page) #callback 則把得到的結果傳給了回調味函數進行處理    p.close()    p.join()    print(‘主進程pid:‘,os.getpid())

七、進程池控制套位元組的並發通訊執行個體

#用戶端from socket import *c=socket(AF_INET,SOCK_STREAM)c.connect((‘127.0.0.1‘,8080))while True:    msg=input(‘>>: ‘).strip()    if not msg:continue    c.send(msg.encode(‘utf-8‘))    data=c.recv(1024)    print(data.decode(‘utf-8‘))c.close()
#服務端
from
multiprocessing import Poolimport osfrom socket import *s=socket(AF_INET,SOCK_STREAM)s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)s.bind((‘127.0.0.1‘,8080))s.listen(5)def talK(conn,addr): print(os.getpid()) while True: try: data=conn.recv(1024) if not data:break conn.send(data.upper()) except Exception: break conn.close()if __name__ == ‘__main__‘: p=Pool(4) while True: conn,addr=s.accept() p.apply_async(talK,args=(conn,addr)) s.close()

 


 

Python 進程池

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.