python多進程併發之multiprocessing

Python併發之多進程 -- multiprocessing

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下則不須要。函數

multiprocess.Pool

當被操做對象數目不大時,能夠直接利用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

相關文章
相關標籤/搜索