Python多處理簡介

2021-10-07 10:36:44 字數 4796 閱讀 2076

多處理程式包使用類似於執行緒模組的api支援生成過程。 它還提供本地和遠端併發。 本教程將討論python中的多重處理,以及如何使用多重處理在程序之間進行通訊並執行程序之間的同步以及日誌記錄。

如下所示,通過建立乙個process物件然後呼叫其start()方法來進行多處理。

from multiprocessing import process

def greeting():

print 'hello world'

if __name__ == '__main__':

p = process(target=greeting)

p.start()

p.join()

在上面的示例**中,我們首先匯入process類,然後使用要執行的greeting函式例項化process物件。

然後,我們告訴該過程開始使用start()方法,最後使用join()方法完成該過程。

另外,您還可以通過提供args關鍵字引數來將引數傳遞給函式,如下所示:

from multiprocessing import process

def greeting(name):

print 'hello' + " " + name

if __name__ == '__main__':

p = process(target=greeting, args=('world',))

p.start()

p.join()

讓我們看乙個更詳細的示例,其中涵蓋了我們上面討論的所有概念。

在此示例中,我們將建立乙個計算數字平方並將結果列印到控制台的過程。

from multiprocessing import process

def square(x):

for x in numbers:

print('%s squared is %s' % (x, x**2))

if __name__ == '__main__':

numbers = [43, 50, 5, 98, 34, 35]

p = process(target=square, args=('x',))

p.start()

p.join

print "done"

#result

done

43 squared is 1849

50 squared is 2500

5 squared is 25

98 squared is 9604

34 squared is 1156

35 squared is 1225

您還可以同時建立多個程序,如下例所示,其中程序p1獲取數字平方的結果,而第二個程序p2檢查給定數字是否為偶數。

from multiprocessing import process

def square(x):

for x in numbers:

print('%s squared is %s' % (x, x**2))

def is_even(x):

for x in numbers:

if x % 2 == 0:

print('%s is an even number ' % (x))

if __name__ == '__main__':

numbers = [43, 50, 5, 98, 34, 35]

p1 = process(target=square, args=('x',))

p2 = process(target=is_even, args=('x',))

p1.start()

p2.start()

p1.join()

p2.join()

print "done"

#result

43 squared is 1849

50 squared is 2500

5 squared is 25

98 squared is 9604

34 squared is 1156

35 squared is 1225

50 is an even number

98 is an even number

34 is an even number

done

多重處理支援程序之間的兩種通訊通道:

queue物件用於在程序之間傳遞資料。 它們可以儲存任何可醃製的python物件,您可以使用它們,如下例所示:

import multiprocessing

def is_even(numbers, q):

for n in numbers:

if n % 2 == 0:

q.put(n)

if __name__ == "__main__":

q = multiprocessing.queue()

p = multiprocessing.process(target=is_even, args=(range(20), q))

p.start()

p.join()

while q:

print(q.get())

在上面的示例中,我們首先建立乙個檢查數字是否為偶數的函式,然後將結果放在佇列的末尾。 然後,我們例項化乙個佇列物件和乙個流程物件並開始流程。

最後,我們檢查佇列是否為空,如果不是,則從佇列的最前面獲取值並將其列印到控制台。

我們已經展示了如何使用佇列在兩個程序之間共享資料,結果如下所示。

# result02

46810

1214

1618

多處理中的管道主要用於程序之間的通訊。 用法很簡單:

from multiprocessing import process, pipe

def f(conn):

conn.send(['hello world'])

conn.close()

if __name__ == '__main__':

parent_conn, child_conn = pipe()

p = process(target=f, args=(child_conn,))

p.start()

print parent_conn.recv()

p.join()

pipe()返回兩個表示管道兩端的連線物件。 每個連線物件都有send()recv()方法。 在這裡,我們建立乙個程序,該程序列印字串hello world,然後共享資料。

結果

# result

['hello world']

locks通過確保一次僅執行乙個程序來工作,從而阻止其他程序執行類似的**。 這樣就可以完成該過程,然後才能釋放該鎖。

下面的示例顯示了lock方法的非常簡單的用法。

from multiprocessing import process, lock

def greeting(l, i):

l.acquire()

print 'hello', i

l.release()

if __name__ == '__main__':

lock = lock()

names = ['alex', 'sam', 'bernard', 'patrick', 'jude', 'williams']

for name in names:

process(target=greeting, args=(lock, name)).start()

#result

hello alex

hello sam

hello bernard

hello patrick

hello jude

hello williams

在此**中,我們首先匯入lock方法,獲取它,執行列印功能,然後釋放它。

多重處理模組還提供了對日誌的支援,儘管日誌包不使用鎖,因此程序之間的訊息最終可能在執行過程中被混淆。

日誌的用法很簡單:

import multiprocessing, logging

logger = multiprocessing.log_to_stderr()

logger.setlevel(logging.info)

logger.warning('error has occurred')

在這裡,我們首先匯入日誌記錄和多處理模組,然後定義multiprocessing.log_to_stderr()方法,該方法執行對get_logger()的呼叫,並新增乙個將輸出傳送至sys.stderr的處理程式。 最後,我們設定記錄器級別和要傳達的訊息。

本教程介紹了開始使用python進行多處理的必要條件。 多處理克服了gil(全域性直譯器鎖定)的問題,因為它利用了子程序而不是執行緒的使用。

翻譯自:

異構多處理系統

早期嵌入式處理系統通常由乙個微控制器和一系列外設構成。這些系統通常用來完成獲取少量資料 處理資料 做出決策 基於決策結果輸出資訊等工作。在某些情況下會實現簡單的人機互動介面如讀取鍵盤並顯示結果。處理需求 同時產生需求,以現在的標準來看似乎微不足道。現代嵌入式系統通常需要處理和分析十億位元組級的海量資...

Python學習中多執行緒和多處理指南

使用python分析資料,如果使用了正確的資料結構和演算法,有時可以大量提高程式的速度。實現此目的的一種方法是使用muiltithreading 多執行緒 或multiprocessing 多重處理 多執行緒沒有執行緒 一共用時 23秒。多執行緒讓我們看看pyhton中的執行緒模組如何顯著地改進我們...

OpenUOM 多處理之 最新架構

好久沒有更新這個系列了,因為我之前也說過,前段時間實在太忙了,而且早在乙個月前就預示著本月將更加忙!事實也確實如此!終於在國慶前夕完成了既定的計畫,心裡也終於可以長出一口氣了。最近在忙什麼呢?其實就是openuom 既然openuom ng已經不在計畫內,那麼讓openuom 支援多處理就是必然要做...