17 python --多進程

多進程多線程

概念:
進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啓動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程能夠分爲系統進程和用戶進程。凡是用於完成操做系統的各類功能的進程就是系統進程,它們就是處於運行狀態下的操做系統自己;用戶進程就沒必要我多講了吧,全部由你啓動的進程都是用戶進程。進程是操做系統進行資源分配的單位。app

多進程和多線程的區別:async

多線程使用的是cpu的一個核,適合io密集型
多進程使用的是cpu的多個核,適合運算密集型ide

組件:函數

Python提供了很是好用的多進程包,multiprocessing,咱們在使用的時候,只須要導入該模塊就能夠了。ui

Multiprocessing支持子進程,通訊,共享數據,執行不一樣形式的同步,提供了Process,Pipe, Lock等組件this

 

Processspa

1. 建立一個Process對象
p = multiprocessing.Process(target=worker_1, args=(2, ))操作系統

target = 函數名字
args = 函數須要的參數,以tuple的形式傳入
注意: 單個元素的tuple的表現形式線程


multprocessing用到的兩個方法
cpu_count() 統計cpu總數
active_children() 得到全部子進程

 

 Process的經常使用方法
is_alive() 判斷進程是否存活
run() 啓動進程
start() 啓動進程,會自動調用run方法,這個經常使用
join(timeout) 等待進程結束或者直到超時

 Process的經常使用屬性
name 進程名字
pid 進程的pid

import multiprocessing
# multiprocessing.active_children()    列出存在的子進程
# 1 ->2, 3, 4
#cpu_count()     統計cpu的個數
import time


def worker(interval):
    time.sleep(interval)
    print("hello world")

if __name__ == "__main__":
    p = multiprocessing.Process(target=worker, args=(5,))
    p.start()
    print(p.is_alive())
    p.join(timeout=3)  #等待子進程執行完畢或者超時退出
    print("end main")
    print(p.name)
    print(p.pid)
View Code
import multiprocessing
import time


def worker(name, interval):
    print("{0} start".format(name))
    time.sleep(interval)
    print("{0} end".format(name))

if __name__ == "__main__":
    print("main start")
    print("this Computer has {0}".format(multiprocessing.cpu_count()))
    p1 = multiprocessing.Process(target=worker, args=("worker1", 2))
    p2 = multiprocessing.Process(target=worker, args=("worker2", 3))
    p3 = multiprocessing.Process(target=worker, args=("worker3", 4))
    p1.start()
    p2.start()
    p3.start()
    for p in multiprocessing.active_children():
        print("the pid of {0} is {1}".format(p.name, p.pid))
    print("main end")
View Code

import multiprocessing

# lock = multiprocessing.Lock()
# lock.acquire()           獲取鎖
# lock.release()          釋放鎖
# with lock:
# 不加鎖程序
# number   +1
# number   +3
import time


def add(number, value, lock):
    lock.acquire()
    try:
        print("init add{0} number = {1}".format(value, number))
        for i in xrange(1, 6):
            number += value
            time.sleep(1)
            print("add{0} number = {1}".format(value, number))
    except Exception as e:
        raise e
    finally:
        lock.release()

if __name__ == "__main__":
    lock = multiprocessing.Lock()
    number = 0
    p1 = multiprocessing.Process(target=add, args=(number, 1, lock))
    p2 = multiprocessing.Process(target=add, args=(number, 3, lock))
    p1.start()
    p2.start()
    print("main end")
View Code

共享內存

import multiprocessing
import time


# Value()
# Array()

def add(number, add_value, lock):
    lock.acquire()
    try:
        print("init add{0} number = {1}".format(add_value, number.value))
        for i in xrange(1, 6):
            number.value += add_value
            print("##############add{0} has added!############".format(add_value))
            time.sleep(1)
            print("add{0} number = {1}".format(add_value, number.value))
    except Exception as e:
        raise e
    finally:
        lock.release()

def change(arr):
    for i in range(len(arr)):
        arr[i] = -arr[i]

if __name__ == "__main__":
    lock = multiprocessing.Lock()
    number = multiprocessing.Value('i', 0)
    arr = multiprocessing.Array('i', range(10))
    print(arr[:])
    p1 = multiprocessing.Process(target=add, args=(number, 1, lock))
    p2 = multiprocessing.Process(target=add, args=(number, 3, lock))
    p3 = multiprocessing.Process(target=change, args=(arr,))
    p1.start()
    p2.start()
    p3.start()
    p3.join()
    print(arr[:])
    print("main end")
View Code

manage

import multiprocessing


def worker(d, l):
    l += range(11, 16)
    for i in xrange(1, 6):
        key = "key{0}".format(i)
        val = "val{0}".format(i)
        d[key] = val


if __name__ == "__main__":
    manager = multiprocessing.Manager()
    d = manager.dict()
    l = manager.list()
    p = multiprocessing.Process(target=worker, args=(d, l))
    p.start()
    p.join()
    print(d)
    print(l)
    print("main end")
View Code

進程池

import multiprocessing

import time


def worker(msg):
    print("########start {0}##########".format(msg))
    time.sleep(1)
    print("########end   {0}##########".format(msg))

if __name__ == "__main__":
    print("main start")
    pool = multiprocessing.Pool(processes=3)
    for i in xrange(1, 10):
        msg = "hello {0}".format(i)
        pool.apply_async(func=worker, args=(msg,))
    pool.close()
    pool.join() #在join以前,必定要調用close,不然報錯。
    print("main end")
View Code
相關文章
相關標籤/搜索