Python學習多進程介紹

高洛峰
發布: 2017-03-22 10:19:06
原創
1038 人瀏覽過

多進程的基本使用

import multiprocessing
import os
import time
 
 
def run():
    print("父进程:%s,子进程:%s" % (os.getppid(), os.getpid()))
    time.sleep(2)
 
if __name__ == "__main__":
        p = multiprocessing.Process(target=run)
        p.start()
        p.join()
登入後複製

進程間通訊

不同進程間記憶體是不共享的,要實現兩個進程間的資料交換,可以用以下方法

Queue

import multiprocessing
 
 
def f(q):
    q.put(11111)
 
if __name__ == "__main__":
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=f, args=(q,))
    p.start()
    print(q.get())
登入後複製

Pipe

import multiprocessing
 
 
def f(conn):
    conn.send(1)
    conn.send(2)
    print(conn.recv())
    conn.close()
 
if __name__ == "__main__":
    parent_conn, child_conn = multiprocessing.Pipe()
    p = multiprocessing.Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    print(parent_conn.recv())
    parent_conn.send(3)
    p.join()
登入後複製

進程間的資料共享

Manager

import multiprocessing
import os
 
 
def func(d, l):
    d[os.getpid()] = os.getpid()
    print(d)
    l.append(os.getpid())
    print(l)
 
if __name__ == "__main__":
    manager = multiprocessing.Manager()
    d = manager.dict()
    l = manager.list()
    p_list = []
    for i in range(5):
        p = multiprocessing.Process(target=func, args=(d, l))
        p.start()
        p_list.append(p)
    for p in p_list:
        p.join()
登入後複製

    

進程鎖定

當多個進程要存取共享資源時,Lock可以避免存取衝突

import multiprocessing
 
 
def f(l, i):
    l.acquire()
    print("hello world", i)
    l.release()
 
if __name__ == "__main__":
    lock = multiprocessing.Lock()
    for num in range(10):
        p = multiprocessing.Process(target=f, args=(lock, num))
        p.start()
登入後複製

進程池

進程池內部維護一個進程隊列,當使用時,則去進程池中取得一個進程,如果進程池中沒有可使用的進程,那麼程式就會等待,直到進程池中有進程

import multiprocessing
import os
import time
 
 
def foo(i):
    time.sleep(2)
    print("in process", os.getpid())
    return i + 100
 
 
def bar(arg):
    print("==>exec done:", arg)
 
if __name__ == "__main__":
    pool = multiprocessing.Pool(5)
    for i in range(10):
        pool.apply_async(func=foo, args=(i,), callback=bar)
    print("end")
    pool.close()
    pool.join()
登入後複製

   

以上是Python學習多進程介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板