嘗試學習python的多程序模組,對比多執行緒,大概的區別在:
1.多程序的處理速度更快
2.多程序的各個子程序之間交換資料很不方便
多程序呼叫方式
程序基本使用multicore()
程序池優化程序的呼叫multicore_pool(),在使用程序池的時候,運許函式有return,而基本用法中程序是接收不了return的
程序佇列用法,大部分方法和python的基本佇列是一致的,
q=mp.queue() 宣告
q.put() 新增
q.get() 釋放
q.empty() 判斷是不是空的
created on tue dec 5 09:00:00 2017
@author: hellcat
import time
import numpy as np
import threading as td
import multiprocessing as mp
def job(q):
for i in range(3):
q.put(i)
def multicore():
q=mp.queue()
ps = [mp.process(target=job,args=(q,)),
mp.process(target=job,args=(q,))] # 基本的子程序建立方法
for p in ps:
p.start()
time.sleep(3)
for p in ps:
p.join() # 需要協調結束
while true:
if q.empty() != true:
print(q.get())
else:
break
def multithread():
q=mp.queue()
ps = [td.thread(target=job,args=(q,)),
td.thread(target=job,args=(q,))] # 基本的子執行緒建立方法
for p in ps:
p.start()
time.sleep(3)
for p in ps:
p.join()
while true:
if q.empty() != true:
print(q.get())
else:
break
def job_pool(q):
res0 = 0
for i in range(np.random.randint(10)):
res0 += i**3
return res0
def multicore_pool():
pool = mp.pool(processes=2) # 初始化程序池,可以指定程序數
print(res1) # 返回值為函式的return
print([res.get() for res in res2]) # 注意此時每個程序的返回並不直接是return,需要get方法得到的才是return
# for res in res2:
# print(res.get())
if __name__=='__main__':
# multicore()
# multithread()
multicore_pool()
程序共享變數 & 程序鎖
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
created on tue dec 5 10:15:58 2017
@author: hellcat
import time
import multiprocessing as mp
def job(v,num,l): # 需要把共享變數例項作為引數傳入才行
l.acquire() # 程序鎖鎖住
for _ in range(10):
time.sleep(0.1)
v.value += num # 獲取共享變數的值,並進行操作
print(v.value)
l.release() # 程序鎖釋放
def muticore():
l = mp.lock() # 例項化程序鎖
v = mp.value('i',0) # 例項化共享變數
# p = mp.pool(processes=2)
# p.map(job,((v,1,l),(v,3,l)))
p1 = mp.process(target=job,args=(v,1,l))
p2 = mp.process(target=job,args=(v,3,l))
p1.start()
p2.start()
p1.join()
p2.join()
if __name__=='__main__':
muticore()
不同於多執行緒使用全域性變數就可以以共享變數,多程序必須使用 v = mp.value('i',0)這樣的語句宣告變數(其實還可以是mp.array('i',[1,2,3]),注意,這裡只能是1維的list,[[1,2]]這樣都是不可以的),並將v作為引數傳給函式,在函式內部使用的時候也需要使用v.value來喚醒其值。
程序鎖會在鎖住時阻止其他程序使用共享變數,所以可以看到輸出中先執行了10次+1,然後執行了10次+3,而不使用程序鎖+1和+3會無規律的交替進行:
注釋掉程序鎖:
使用程序鎖(上面**沒有注釋掉程序鎖):
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
python多程序 Python多程序實踐
建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...
python多程序 Python多程序程式設計詳解
本文 在 python 3.6 環境下測試通過。多程序 multiprocessing 模組是在 python 2.6 版本中加入的,和多執行緒 threading 模組類似,都是用來做並行運算的。不過python既然有了threading,為什麼還要搞乙個multiprocessing呢?這是因為...