multiprocessing包是Python中的多進程管理包。 它與 threading.Thread相似,能夠利用multiprocessing.Process對象來建立一個進程。該進程能夠容許放在Python程序內部編寫的函數中。該Process對象與Thread對象的用法相同. 方法有:html
- is_alive()
- join([timeout])
- run()
- start()
- terminate() 屬性有:
- authkey
- daemon(要經過start()設置)
- exitcode(進程在運行時爲None、若是爲–N,表示被信號N結束)
- name
- pid
此外multiprocessing包中也有Lock/Event/Semaphore/Condition類,用來同步進程,其用法也與threading包中的同名類同樣。multiprocessing的很大一部份與threading使用同一套API,只不過換到了多進程的情境。python
這個模塊表示像線程同樣管理進程,這個是multiprocessing的核心,它與threading很類似,對多核CPU的利用率會比threading好的多。python3.x
看一下Process類的構造方法:併發
__init__(self, group=None, target=None, name=None, args=(), kwargs={})
參數說明:app
group:進程所屬組。基本不用 target:表示調用對象。 args:表示調用對象的位置參數元組。 name:別名 kwargs:表示調用對象的字典。
建立進程的簡單實例:異步
import requests from multiprocessing import Process urls = [ "http://www.python.org", "http://www.python.org/about/", "http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html", "http://www.python.org/doc/", "http://www.python.org/download/", "http://www.python.org/getit/", "http://www.python.org/community/", "https://wiki.python.org/moin/", ] def get_status_code(url): resp = requests.get(url) print("url:{}\ncode:{}\n{}".format(url, resp.status_code, "-" * 100)) if __name__ == "__main__": for url in urls: p = Process(target=get_status_code, args=(url,)) p.start() p.join()
執行結果:async
url:http://www.python.org code:200 ------------------------------------------------------------------------------ url:http://www.python.org/about/ code:200 ------------------------------------------------------------------------------ url:http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html code:200 ------------------------------------------------------------------------------ url:http://www.python.org/doc/ code:200 ------------------------------------------------------------------------------ url:http://www.python.org/download/ code:200 ------------------------------------------------------------------------------ url:http://www.python.org/getit/ code:200 ------------------------------------------------------------------------------ url:http://www.python.org/community/ code:200 ------------------------------------------------------------------------------ url:https://wiki.python.org/moin/ code:200
建立子進程時,只須要傳入一個執行函數和函數的參數,建立一個Process實例,並用其start()方法啓動,join()方法表示等待子進程結束之後再繼續往下運行,一般用於進程間的同步。 注意: 在Windows上要想使用進程模塊,就必須把有關進程的代碼寫在當前.py文件的if name == ‘main’ :語句的下面,才能正常使用Windows下的進程模塊。Unix/Linux下則不須要。函數
當被操做對象數目不大時,能夠直接利用multiprocessing中的Process動態成生多個進程,十幾個還好,但若是是上百個,上千個目標,手動的去限制進程數量卻又太過繁瑣,此時能夠發揮進程池的功效。url
Pool能夠提供指定數量的進程供用戶調用,當有新的請求提交到pool中時,若是池尚未滿,那麼就會建立一個新的進程用來執行該請求;但若是池中的進程數已經達到規定最大值,那麼該請求就會等待,直到池中有進程結束,纔會建立新的進程來它。.net
apply_async和apply 函數原型:
apply_async(func[, args=()[, kwds={}[, callback=None]]])
兩者都是向進程池中添加新的進程,不一樣的時,apply每次添加新的進程時,主進程和新的進程會並行執行,可是主進程會阻塞,直到新進程的函數執行結束。 這是很低效的,因此python3.x以後再也不使用 apply_async和apply功能相同,可是主進程不會阻塞。
import requests from multiprocessing import Pool urls = [ "http://www.python.org", "http://www.python.org/about/", "http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html", "http://www.python.org/doc/", "http://www.python.org/download/", "http://www.python.org/getit/", "http://www.python.org/community/", "https://wiki.python.org/moin/", ] def get_status_code(url): resp = requests.get(url) print("url:{}\ncode:{}\n{}".format(url, resp.status_code, "-" * 100)) if __name__ == "__main__": # 維持執行的進程總數爲processes,當一個進程執行完畢後會添加新的進程進去 p = Pool() for url in urls: # 異步開啓進程, 非阻塞型, 可以向池中添加進程而不等待其執行完畢就能再次執行循環 p.apply_async(func=get_status_code, args=(url,)) print("Waiting for all subprocesses done...") p.close() # 關閉pool, 則不會有新的進程添加進去 p.join() # 必須在join以前close, 而後join等待pool中全部的線程執行完畢 print('All subprocesses done.')
運行結果:
Waiting for all subprocesses done... url:http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html code:200 ------------------------------------------------------------------------------ url:http://www.python.org/doc/ code:200 ---------------------------------------------------------------------------------------------------- url:http://www.python.org/about/ code:200 ------------------------------------------------------------------------------ url:http://www.python.org code:200 ------------------------------------------------------------------------------ url:https://wiki.python.org/moin/ code:200 ------------------------------------------------------------------------------ url:http://www.python.org/download/ code:200 ------------------------------------------------------------------------------ url:http://www.python.org/community/ code:200 ------------------------------------------------------------------------------ url:http://www.python.org/getit/ code:200 ------------------------------------------------------------------------------ All subprocesses done.
http://blog.csdn.net/GVFDBDF/article/details/53584299 https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868323401155ceb3db1e2044f80b974b469eb06cb43000