python多程序優化 Python 多程序處理

2021-10-11 01:23:11 字數 2830 閱讀 2389

嘗試學習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呢?這是因為...